1 意图:将一个类的接口转换成客户期望的另外一个接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2 别名:Wrapper
3 TextShape类来适配TextView的接口和Shape的接口
1)继承Shape的接口和TextView的实现
2)将一个TextView的实例作为TextShape的组成部分,用TextView的接口实现TextShape
对应于Adapter模式的类版本和对象版本。TextShape为适配器 Adapter
4 适用性:
. 使用一个已存在的类,接口不符合要求
. 创建一个可复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
. 使用已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它们的父类接口
5 参与者:
Target:定义客户使用的与特定领域相关的接口
Client:与符合target的接口协同
Adaptee:定义一个已存在的接口,这个接口需要适配
Adapter:对Adaptee接口与Target接口适配
6 协作:client在Adapter实例上调用一些操作。
7 效果:类适配器和对象适配器有不同的权衡。
类适配器:
. 用一个具体的适配器类对Adaptee和Target匹配。当匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。
. Adapter可以定义Adaptee的部分行为,因为Adapter是Adaptee的子类
. 仅仅引入一个对象,不需要额外的指针以间接得到adaptee
对象适配器原则:
. 允许一个Adapter与多个Adaptee——即Adaptee本身以及它的所有子类同时工作。
. 改变Adaptee的行为很困难,需要生成Adaptee的子类使得Adapter引用子类,而不是Adaptee本身
考虑其他因素:
1)Adapter的匹配程度
2)可插入的Adapter:
3)使用双向适配器提供透明操作:多态继承实现双向适配
8 实现:
注意问题:
1)C++实现时,public继承target(继承接口)、私有继承Adaptee(继承实现)
2)可插入的适配器,有三种实现方式:
. 首先为Adaptee找到一个窄接口,即可用于适配的最小操作集。最小的接口集包含两个操作:
一个操作定义在层次结构中表示一个节点,另一个操作返回该节点的子节点
窄接口三种实现途径:
a)使用抽象操作
b)使用代理对象
c)参数化的适配器
相关模式:
1)模式bridge的结构与对象适配器类似,但是bridge模式的出发点不同:bridge目的将接口部分和实现部分分离,可以对二者相对独立的改变。
Adapter是改变一个已有对象的接口
2)Decorator增强了其他对象的功能同时不改变它的接口。decorator透明性更好,decorator支持递归。
3)proxy在不改变接口的情况下为另一个对象定义了一个代理