定义
适配器模式把一个类的接口变换成客户端所期待的另外一种接口,从而使原本因为接口不匹配而无法一起工作的俩个类能够在一起工作。
使用场景
- 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容。
- 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
- 需要一个统一的输出接口,而输入端的类型不可预知。
UML图
适配器模式.png 解释优点
- 更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式可以让这些功能得到更好的复用 - 更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能。从而自然的扩展系统的功能
缺点
- 过多的使用适配器,会让系统非常凌乱,不易整体把握。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以使用适配器,而是对系统进行重构。
例子
将220V交流电转换为5V的直流电压,
- 被转换的原始对象
/** Adaptee角色,需要被装换的对象
* Created by Niwa on 2017/8/2.
*/
public class Volt220 {
public int getVolt220(){
return 220;
}
}
- 需要转换成的目标角色,5V直流
/** Target角色
* Created by Niwa on 2017/8/2.
*/
public interface FiveVolt {
int getVolt5();
}
- 适配器
/** Adapter角色,将220v的电压装换成5v的电压
* Created by Niwa on 2017/8/2.
*/
public class VoltAdapter extends Volt220 implements FiveVolt{
@Override
public int getVolt5() {
return 5;
}
}
关键点在这里,通过实现要转换成的目标接口,和继承原始类实现接口转换
- 测试类
/** 测试类
* Created by Niwa on 2017/8/2.
*/
public class Client {
public static void main(String[] args){
VoltAdapter voltAdapter = new VoltAdapter();
System.out.println("输出电压:" + voltAdapter.getVolt5());
}
}
输出结果:
输出电压:5
源代码:DesignPattern
参考:
《Android源码设计模式解析与实战读书》
各大佬博客
end
网友评论