设计模式之适配器模式
适配器模式将一个类的接口,转换成客户期待的另一个接口。适配器让原本接口不兼容的类可以合作无间。
解析这个定义:
- 客户端依赖的接口TargetInterface,无法用现有的类adaptee实现,需要增加一个新类adapter来包装实现,但客户对此应透明,感知不到,如何才能感知不到,就需要adapter类继承或实现客户端依赖的类或接口,这样依赖抽象编程,就可以在子类去完成适配转换。
- 适配类adapter要能实现客户要求的能力,如何做到,有两种方式,一种是直接关联一个adaptee对象,调用对象的目标方法;另一种方式是直接通过继承,自动拥有父类的目标方法。这两种实现方式称为对象适配器和类适配器。对象适配器思维更加自然,更为常用,特别是对于需要适配多个类接口时,一些语言是不支持多重继承的,无法用类适配器完成,只能应用对象适配器。
对象适配器还是类适配器,只是如何获取被适配对象的目标功能的两种不同方式而已,很多人常常采用强记的方式学习设计模式,死记类图,其实完全没有必要,更重要的事,理解模式本身的意图本质,和实现目标的思考过程。类图会依据继承或实现画法发生变化,往往让初学者感到疑惑。

// 适配器:组合Adaptee并实现TargetInterface
class Adapter implements TargetInterface {
private Adaptee adaptee; // 组合现有类
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest(); // 委托给Adaptee
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
TargetInterface target = new Adapter(new Adaptee());
target.request();
}
}

// 客户端依赖的接口
interface TargetInterface {
void request();
}
// 现有不兼容的类
class Adaptee {
void specificRequest() {
System.out.println("Adaptee's method");
}
}
// 适配器:继承Adaptee并实现TargetInterface
class Adapter extends Adaptee implements TargetInterface {
@Override
public void request() {
super.specificRequest(); // 调用父类方法,实现适配
}
}
// 客户端代码(对适配无感知)
public class Client {
public static void main(String[] args) {
TargetInterface target = new Adapter();
target.request(); // 实际调用Adaptee的specificRequest()
}
}