Adapter 模式
意图:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。动
意图:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。
动机:在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口时这些现在对象所不满足的。
适用性:
1. 你想使用一个已存在的类,而它的接口不符合你的需求
2. 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作
3. (仅仅适用于对象适配器)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
结构:
类适配器:
对象适配器:
参与者:
Target : 定义Client使用的与特定领域相关的接口
Client : 与符合Target接口的对象协同
Adaptee:定义一个已经存在的接口,这个接口需要适配
Adapter: 对Adaptee的接口与Target接口进行适配
协作:
Client在Adapter实例上调用一些操作。接着适配器调用Adapter的操作实现请求。
效果:
1. 用一个具体的Adapter类对Adaptee和Target进行适配。结果是当我们想要匹配一个类以及他的子类的时候,类Adapter将不能胜任工作。
2. 使得Adapter可以重新定义Adaptee的部分行为,因为Adapter是Adaptee的子类
3. 仅仅引入一个对象,并不需要额外的指针以间接得到Adaptee
4. 允许一个Adapter与多个Adaptee-Adaptee本身以及它的所有子类同时工作,Adapter也可以一次给所有的Adaptee添加功能。
5. 使得重定义Adaptee的行为比较困难。
实现:
代码示例如下:
#include <iostream>nclass ITarget{npublic:n virtual ~ITarget(){}n virtual void Process() = 0;nnprotected:n ITarget(){}n};nclass Adaptee{npublic:n void OldInterface(){n std::cout << "exec " << std::endl;n }n};nclass Adapter : public ITarget{npublic:n Adapter(Adaptee *_p){n _adaptee = _p;n }n void Process(){n _adaptee->OldInterface();n }nprivate:n Adaptee *_adaptee;n};nint main(int argc,char *argv[])n{n Adaptee *_p = new Adaptee;n ITarget *target = new Adapter(_p);n target->Process();n delete _p;n delete target;n return 0;n}n
上一篇:0822