设计模式之旅8--适配器模式
2018-07-15 本文已影响106人
小楠总
1. 定义
适配器模式:把一个类的接口变换为客户端所期待的另一种接口,从而解决接口不兼容问题。
适配器模式分为:类适配器模式、对象适配器模式,UML如下所示:
类适配器模式、对象适配器模式2. 使用场景
- 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。
- 想要建立一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类,包括一些将来可能会被引进的类一起工作。
- 需要一个统一的输出接口,而输入端的类型不可预知。
- Android中ListView、RecycleView等控件的设计就采用了适配器模式。
3. 实现
3.1 类适配器
原角色:
public class Adaptee {
//原有的业务逻辑
public void volt220() {
System.out.println("220V电压");
}
}
目标角色:
public interface Target {
void volt5();
}
public class ConcreteTarget implements Target {
@Override
public void volt5() {
System.out.println("5V电压");
}
}
适配器角色:
public class Adapter extends Adaptee implements Target {
@Override
public void volt5() {
System.out.println("5V电压");
}
public void volt220() {
super.volt220();
}
}
场景类:
public class Client {
public static void main(String[] args) {
Target t1 = new ConcreteTarget();
t1.volt5();
Target t2 = new Adapter();
t2.volt5();
}
}
3.2 对象适配器(用得比较多)
适配器角色(核心不同时:适配器角色持有了原角色):
public class Adapter implements Target {
private Adaptee mAdaptee;
public Adapter(Adaptee adaptee) {
mAdaptee = adaptee;
}
@Override
public void volt5() {
System.out.println("5V电压");
}
public void vol220() {
mAdaptee.volt220();
}
}
场景类:
public class Client {
public static void main(String[] args) {
Target t1 = new ConcreteTarget();
t1.volt5();
Target t2 = new Adapter(new Adaptee());
t2.volt5();
}
}
4. 优点
- 提高代码复用性:更好地复用现有的类,而并不需要大范围地重构代码
- 更好的扩展性
5. 缺点
- 适配器模式过多地使用,系统会比较凌乱,不易把握。
- 基于以上的观点,在重构能够解决的前提下,尽量不要使用适配器模式。