适配器模式,让我想起了家里面的变电站。其实,这里的适配器也是这个作用,起到了一个居中调解的作用。当客户类和源类的接口不兼容而不能一起工作时,适配器技术可以引入来解决这个问题。
前提:源类具有所有问题解决方案。适配器只是起到一个转换的作用,而不是解决客户类实际问题的方案。
意图:
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性:
你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
代码如下:
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 // 适配器模式
5
6 class Adaptee
7 {
8 public:
9 Adaptee() {}
10 ~Adaptee() {}
11 void specificRequest()
12 {
13 cout << "this is adaptee class" << endl;
14 }
15 };
16
17 class Target
18 {
19 public:
20 Target() {}
21 ~Target() {}
22 virtual void request() = 0;
23 };
24
25 class ClassAdapter : public Target, public Adaptee // 类适配器
26 {
27 public:
28 ClassAdapter() {}
29 ~ClassAdapter() {}
30 virtual void request()
31 {
32 specificRequest();
33 cout << "this classadapter sample!" << endl;
34 }
35 };
36
37 class ObjectAdapter : public Target // 对象适配器
38 {
39
40 private:
41 Adaptee adaptee;
42
43 public:
44 ObjectAdapter(Adaptee &a)
45 {
46 this->adaptee = a;
47 }
48 ~ObjectAdapter() {}
49 virtual void request()
50 {
51 this->adaptee.specificRequest();
52 cout << "this objectadapter sample!" << endl;
53 }
54 };
55 void main()
56 {
57 ClassAdapter a;
58 a.request();
59 Adaptee adaptee;
60 ObjectAdapter oa(adaptee);
61 oa.request();
62 }
输出:
this is adaptee class
this classadapter sample!
this is adaptee class
this objectadapter sample!
请按任意键继续. . .
实现了在适配器中调用源类(Target)中的specificRequest方法的过程。而客户类无需知道源类中specificRequest方法到底是怎么实现的。
————————————————————————————————————
定义了类Processor,在Processor对象工作在Apply类方法中,同时在其他地方定义了一个Test类,其内部结构和Processor类类似。但是现在Apply中的方法是不能接收Test类的。在不改变Test类的基础上,我们可以定义一个TestAdjust类(类适配器)来解决这个问题。