Adapter(DesignPattern)

Adapter

目的

将一个类的接口转换成client希望使用的另外一个接口。通过Adapter模式,两个接口不兼容的类得以协同工作。

动机

假如有一个绘图编辑器,它通过一堆图形对象为客户所操作,而这些图形对象的接口由一个Shape的抽象类定义。当我们希望使用textshape这一个子类来编辑显示正文时,难以实现,因为其涉及到了诸如缓冲刷新的问题。而此时工具包中已经提供了一个textview的类拥有这个功能,但当时工具的设计者没有提供到互相兼容的接口。

因此为了解决这个问题,我们可以使用adapter模式来使其兼容。

使用范围

  • 希望使用一个已经存在的类;
  • 希望创建一个可以复用的类,但该类可以与其它不相干(接口不兼容)的类协同工作;
  • (仅仅适用于对象adapter)希望使用已经存在的子类,但又不希望对每一个子类匹配接口。可以使用对象adapter;

效果

针对类adapter和对象adapter,会产生不同的效果

类adapter

  • 一般情况下,将adapter公共继承target,私有继承adaptee,这样就可以部分重定义adaptee的行为,也不需要额外的指针去指向adaptee

对象adapter

  • 允许一个adapter和多个adaptee交互同时工作,只需要在adapter类内存有相关指针变量即可;
  • 但这种方法难以重定义adaptee;

代码实例

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
46
47
48
49
50
51
52
53
54
55
56
// Adapter.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>

using namespace std;

class Target {
public:
Target(){}
virtual void Request(){ cout << "Target::Request..." << endl; }
virtual ~Target(){}
};

class Adaptee {
public:
Adaptee(){}
void SpecificRequest() { cout << "Adaptee::SpecificRequest..." << endl; }

};

class Adapter_class : public Target, private Adaptee{
public:
Adapter_class() {}
virtual void Request(){
Adaptee::SpecificRequest();
}
};

class Adapter_obj : public Target
{
public:
Adapter_obj(Adaptee* adaptee) {
_adaptee = adaptee;
}
virtual void Request() {
_adaptee->SpecificRequest();
}
private:
Adaptee* _adaptee;
};



int main()
{
Adapter_class adapter;//class adapter
adapter.Request();
cout << "............................" << endl;
Adaptee *adaptee = new Adaptee();
Adapter_obj adapter_o(adaptee);//object adapter
adapter_o.Request();
delete adaptee;
return 0;
}