参考书籍:《java设计模式》刘伟
对象适配器模式
在对象适配器模式结构图中包含如下几个角色:
- Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以
是具体类。 - Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进
行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个
Adaptee对象使二者产生联系。 - Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口
需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可
能没有适配者类的源代码。
根据对象适配器模式结构图,在对象适配器中,客户端需要调用request()方法,而适配者类
Adaptee没有该方法,但是它所提供的specificRequest()方法却是客户端所需要的。为了使客户
端能够使用适配者类,需要提供一个包装类Adapter,即适配器类。这个包装类包装了一个适
配者的实例,从而将客户端与适配者衔接起来,在适配器的request()方法中调用适配者的
specificRequest()方法。因为适配器类与适配者类是关联关系(也可称之为委派关系),所以
这种适配器模式称为对象适配器模式。典型的对象适配器代码如下所示:
class Adapter extends Target {
private Adaptee adaptee; //维持一个对适配者对象的引用
public Adapter(Adaptee adaptee) {
this.adaptee=adaptee;
}
public void request() {
adaptee.specificRequest(); //转发调用
}
}
类适配器模式
根据类适配器模式结构图,适配器类实现了抽象目标类接口Target,并继承了适配者类,在适
配器类的request()方法中调用所继承的适配者类的specificRequest()方法,实现了适配。
典型的类适配器代码如下所示:
class Adapter extends Adaptee implements Target {
public void request() {
specificRequest();
}
}
由于Java、C#等语言不支持多重类继承,因此类适配器的使用受到很多限制,例如如果目标
抽象类Target不是接口,而是一个类,就无法使用类适配器;此外,如果适配者Adapter为最终
(Final)类,也无法使用类适配器。在Java等面向对象编程语言中,大部分情况下我们使用的是
对象适配器,类适配器较少使用。