定义:
将一个接口转换为客户需要的另外一个接口,使接口不兼容的类型可以一起工作,也被称为包装器模式(Wrapper Patern)。
结构图:
- Target:目标抽象类,客户所需要的接口。
- Adapter:适配器类需要继承实现Target所定义的接口,并关联一个Adaptee对象,使用其提供的接口来满足Target接口的需求。
- Adaptee:适配者类,即被适配的类,定义了一个已经存在的接口,需要被适配。一般是一个具体类,包含了客户希望使用的业务方法。
对象适配模式
适配器并不继承或实现适配者的接口,而是通过定义一个适配者的成员变脸,调用目标方法。
class Adapter extends Target {
private Adaptee adaptee; //维持一个对适配者对象的引用
public Adapter(Adaptee adaptee) {
this.adaptee=adaptee;
}
public void request() {
adaptee.specificRequest(); //转发调用
}
}
类适配器
类适配器则需要继承或实现适配者的接口和Target接口,这样在Target和Adaptee都是抽象类的情况下,单继承语言就无法使用,因此不太常用。
class Adapter extends Adaptee implements Target {
public void request() {
specificRequest();
}
}
双向适配器
双向适配器同时实现Adaptee的接口和Target接口,并且同时持有Adapter和Target的引用,然后再内容完成方法的互换。
缺省适配器(Default Adapter Pattern)
当不需要实现一个接口所有的方法的时候,可以先设计一个抽象适配器实现该接口,并且该抽象类为接口中的每一个方法提供一个默认实现(空方法),然后改抽象类的子类再选择性地覆盖父类的方法来满足需求。
注意:
- 可以将适配器使用XML和反射技术设置成可配置,来动态更改需要使用的适配器。
优点:
- 可以将目标类和适配者类进行解耦,引入一个适配器来转发目标类的需求,无需修改原有的机构。
- 可以隐藏适配者类的具体操作过程,增加类的适配者的复用性和透明性,可以事适配者在多个系统中被复用。
- 可以灵活地替换适配器来既满足目标需求有可以替换底层实现。
- 如果使用对象适配器,还可以适配多个是适配者,使他们配合工作满足目标接口的需求。
缺点:
- 因为一些语言的不支持多继承的关系,有可能会限制适配者的具体实现形式。
适用场景:
- 系统需要使用一些类,但结构不兼容,而且不能修改代码或不知道源码。
- 需要创造一些可以复用的类,应用于不同的业务逻辑里中。
代码实例: