适配器模式(adapter pattern)
定义
我喜欢的样子你都有
你喜欢的样子我有没有
没有的话,我送你个适配器,好吗
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。——《设计模式:可复用面向对象软件的基础》
适配器模式是一种对象结构型模式。
使用场景
客户端需要一个target(目标)接口,但是不能直接重用已经存在的adaptee(适配者)类,因为它的接口和target接口不一致,所以需要adapter(适配器)将adaptee转换为target接口。前提是target接口和已存在的适配者adaptee类所做的事情是相同或相似,只是接口不同且都不易修改。如果在设计之初,最好不要考虑这种设计模式。凡事都有例外,就是设计新系统的时候考虑使用第三方组件,因为我们就没必要为了迎合它修改自己的设计风格,可以尝试使用适配器模式。
角色
目标角色(target):这是客户锁期待的接口。目标可以是具体的或抽象的类,也可以是接口
适配者角色(adaptee):已有接口,但是和客户器期待的接口不兼容。
适配器角色(adapter):将已有接口转换成目标接口。
分类
适配器模式有分三类:
-
1、类适配器模式(class adapter pattern)
-
2、对象适配器模式(object adapter pattern)
-
3、缺省适配器模式(default adapter pattern),也叫默认适配器模式、接口适配器模式
类适配器模式(class adapter pattern)
类适配器模式在编译时实现target(目标)接口。这种适配器模式使用了多个实现了期待的接口或者已经存在的接口的多态接口。比较典型的就是:target接口被创建为一个纯粹的接口,如Java不支持多继承的语言。
图示
类适配器模式(adapter pattern)结构图:
如上图,因为java没有类多继承,所以只能实现Target接口,而且Target只能是接口。Adapter实现了Target接口,继承了Adaptee类,Target.operation()实现为Adaptee.specificOperation()。
客户端调用类适配器:
这个图是Adapter适配器多继承的情况,引用维基百科,可以看到客户端调用适配器Adapter的methodA时候,实际上调用的是Adapter继承过来的method1到methodN。
代码示例
一张图说明需求:

嗯,就是电源适配器了。上面有这样两行:
输入:100-240V ~ 0.5A 50-60HZ
输出:5.2V ==== 2.4A
我们的需求就是将电源输入220V(适配者)转换为5V输出(目标)。
目标角色(PowerTarget.java):
public interface PowerTarget { public int output5V(); }电源目标。
适配者角色(PowerAdaptee.java):
public class PowerAdaptee { private int output = 220; public int output220V() { System.out.println("电源输出电压:" + output); return output; } }电源适配者。
适配器角色(PowerAdapter.java):
public class PowerAdapter extends PowerAdaptee implements PowerTarget{ @Override public int output5V() { int output = output220V(); System.out.println("电源适配器开始工作,此时输出电压是:" + output); output = output/44; System.out.println("电源适配器工作完成,此时输出电压是:" + output); return output; } }电源适配器类实现了电源目标,继承了适配者。其实如果没有我打印的那些提示或者说日志,output5V方法可以直接写成:
public int output5V() { return output220V()/44; }这样就适配了。
类适配器模式测试类(ClassAdapterPatternTest.java):
