设计模式随笔(七):适配器模式
概述
以电源插座为例,有三孔插头和二孔插头,各个国家标准不一,国外版笔记本如果想在国内插上插头充电,我们肯定都会准备一个转接头将三孔插头/二孔插头转为跟笔记本电源插头来匹配,充上电。这是我们生活中的适配器。
在java中,我们把一个类的接口转换成客户端想要的另一个接口(也就是把国内插孔,转为国外插孔),把因为接口不兼容而不能在一起工作的类,通过适配器(Adapter),是他们能够在一起工作。
UML
把适配的类的API,转为目标类的API
类适配器
Client想要调用-op2方法,但Adaptee并没有提供这个方法,为了使Target能提供-op2这个方法,添加一个中间环节Adapter类继承Adaptee,实现Target接口。因为Adapter和Adaptee是继承关系,决定这个适配器是类适配器
创建Targe接口
interface Target { //这是源类Adapteee没有的方法 void operation_2(); }
创建原类
class Adaptee { public void opration_1() { } }
创建适配器类
//适配器Adapter继承自Adaptee,同时又实现了目标(Target)接口。 class Adapter extends Adaptee implements Target { //这里的适配器只是将opration_1()方法作了一层封装,封装成Target可以调用的opration_2()而已 @Override public void opration_2() { this.opration_1(); } }
Client调用
public class Test{ public static void main(String[] args) { Target mAdapter = new Adapter(); mAdapter.opration_2(); } }
对象适配器
Adapter和Adaptee不再使用继承关系,而是通过委派关系连接到Adapter
创建Target接口和Adaptee源类与类适配器模式相同,不同点在于Adapter代码。
class Adapter implements Target{ // 直接关联被适配类 private Adaptee adaptee; // 可以通过构造函数传入具体需要适配的被适配类对象 public Adapter (Adaptee adaptee) { this.adaptee = adaptee; } @Override public void operation_2() { // 这里是使用委托的方式完成特殊功能 this.adaptee.opration_1(); } }
Client调用
public class AdapterPattern { public static void main(String[] args) { // 步骤4:定义具体使用目标类,并通过Adapter类调用所需要的方法从而实现目标 //需要先创建一个被适配类的对象作为参数 Target mAdapter = new Adapter(new Adaptee()); mAdapter.operation_2(); } }