学习《Android 源码设计模式解析与实践》系列笔记
介绍
经常会碰到两个没有关系的类型之间需要进行交互,但是双方又都不想做出修改,这种尴尬的情况下,可以增加一个 Adapter 的角色,进行两个不同类型的接口的兼容。
例如:读卡器是作为内存卡和笔记本之间的适配器。将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
适配器模式属于结构型模式。
定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作。
使用场景
- 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
- 需要一个统一的输出接口,而输入端的类型不可预知。
结构
适配器模式 UML 图- Target : 目标角色,也就是所期待的得到的接口。
- Adaptee : 需要适配的接口(源接口)。
- Adapter : 适配器角色,目的是把源接口转换成目标接口。
实现
生活中的电压为 220V,而我们使用的笔记本使用的电压只需要 5V,这时我们就需要使用适配器进行转换。
/**
* Target 角色
*/
public interface Voltage5 {
public int getVoltage5();
}
/**
* Adaptee 角色,被适配的对象
*/
public class Voltage220 {
public int getVoltage220() {
System.out.println("Voltage 220V");
return 220;
}
}
/**
* Adapter 角色,负责把 220V 电压转化为 5V
*/
public class VoltageAdapter implements Voltage5 {
private Voltage220 mVoltage220;
public VoltageAdapter(Voltage220 voltage220) {
mVoltage220 = voltage220;
}
@Override
public int getVoltage5() {
System.out.println("经过适配的电压 5V");
return mVoltage220.getVoltage220();
}
public void setVoltage220(Voltage220 voltage220) {
mVoltage220 = voltage220;
}
}
public class Client {
public static void main(String args[]) {
VoltageAdapter adaper = new VoltageAdapter(new Voltage220());
adaper.getVoltage5();
}
}
总结
Adapter 模式的经典实现在于将原本不兼容的接口融合在一起,使之能够很好地进行合作。
优点:
- 更好的复用性
- 更好的扩展性
缺点:
- 过多使用适配器,会让系统非常凌乱,不易整体把握
相关文章:
设计模式整理(1) 代理模式
设计模式整理(2) 单例模式
设计模式整理(3) Builder 模式
设计模式整理(4) 原型模式
设计模式整理(5) 工厂模式
设计模式整理(6) 策略模式
设计模式整理(7) 状态模式
设计模式整理(8) 责任链模式
设计模式整理(9) 观察者模式
设计模式整理(10) 适配器模式
设计模式整理(11) 装饰模式
设计模式整理(12) 中介者模式
网友评论