设计模式随笔(七):适配器模式
概述
以电源插座为例,有三孔插头和二孔插头,各个国家标准不一,国外版笔记本如果想在国内插上插头充电,我们肯定都会准备一个转接头将三孔插头/二孔插头转为跟笔记本电源插头来匹配,充上电。这是我们生活中的适配器。
在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();
}
}

浙公网安备 33010602011771号