目的
将一个类的接口转换成客户希望的另一个接口
适用场景
- 使用一个已存在的类,而它的接口不符合要求
- 创建一个可以复用的类,该类可以与其他不相关的类或不可预
见的类(即那些接口可能不一定兼容的类)协同工作 - 使用一些已经存在的子类,但不可能通过子类化以匹配各自接
口。对象适配器可以适配它的父类接口
角色
Client:代表引用用户期望接口的类
Target:顾名思义,就是用户所期望的接口
Adapter:实现适配功能的具体类
Adaptee:系统原先的接口,而这个接口并不符合需求。
适配器
类适配器
代码示例:
//Target:定义Client使用的与特定领域相关的接口
public interface Target
{ void request(); }
//Adaptee:现在需要适配的已经存在的接口
public class Adaptee
{ public void specificRequest(){} }
//Adapter:对Adaptee 的接口与Target接口进行适配
public class Adapter extends Adaptee implements Target
{
public void request() {
super. specificRequest();
}
}
用一个具体的Adapter类对Adaptee和Target进行匹配, Adapter类多重继承(Java体现为实现接口)Adaptee和Target类。
Adapter可重定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类
如图上代码所示,我们可以看出,完成类适配模式,只需如下几步:
- 完成Target、Adaptee接口编写工作
- 编写Adapter适配器,继承类实现接口,然后重写目标接口的函数。
对象适配器
代码示例:
//Target:定义Client使用的与特定领域相关的接口
public interface Target
{ void request(); }
//Adaptee:现在需要适配的已经存在的接口
public class Adaptee
{ public void specificRequest(){} }
//Adapter:对Adaptee 的接口与Target接口进行适配
public class Adapter implements Target
{
public Adapter(Adaptee adaptee)
{ super(); this.adaptee = adaptee; }
public void request()
{ adaptee.specificRequest(); }
private Adaptee adaptee;
}
允许一个Adapter与多个Adaptee同时工作,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。 Adapter可以一次给所有的Adaptee添加功能
使用组合,不仅可以适配某个类,也可以适配该类的任何子类
我们可以看到类适配器与对象适配器实现区别在于Adapter和Adaptee的关系,我们在使用过程中更倾向于使用对象适配器,原因在对象适配器具有更高灵活性,能够对多个Adaptee进行适配,更加便捷。
效果
- 总体
将目标类和适配者类解耦
增加了类的透明性和复用性
灵活性和扩展性好 - 类适配器模式(继承)
属于静态结构 ,由于只能单继承 - 对象适配器(委托)
可以把多个不同的适配者适配到同一个目标
实现过程较为复杂