1、适配器模式(Apater)将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2、适配器模式主要解决什么问题呢?
答:简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。
3、系统的数据和行为都正确,但接口不符合时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,比如需要对早期代码复用一些功能等应用上很有实际价值。
UML图如下:
根据上图我们知道参与者有:
Target
----定义Client使用的与特定领域相关的接口。
Client
----与符合Target接口的对象协同。
Adaptee
-----定义一个已经存在的接口,这个接口需要适配。
Adapter
----对Adaptee的接口与Target接口进行适配。
4、何时使用适配器模式?
答:使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式,这样客户代码可以统一调用接口就行了,这样应该可以更简单,更直接,更紧凑。
注意:适配器模式不是在一开始有不同的时候就使用它,而是在不容易修改的时候再使用。
5、C++代码实现
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <iostream>
using namespace std; /* Target(这是客户所期待的接口, 目标可以是具体的或抽象的类,也 可以是接口)代码如下: */ class Target { public: virtual void Request() { cout << "普通请求" << endl; } }; /* 需要适配的类,代码如下: */ class Adaptee { public: void SpecificRequest() { cout << "特殊请求" << endl; } }; /* Adapter(通过在内部包装一个Adpatee对象,把源 接口转换成目标接口)代码如下: */ class Adapter : public Target { private: Adaptee adaptee; public: void Request() { adaptee.SpecificRequest(); } }; /* 客户端代码 */ int main() { Target *p_target = new Adapter(); p_target->Request(); return 0; } |