[架构设计]设计模式C++实现--适配器模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式定义:
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器可以分为类适配器和对象适配器。
类适配器使用多重继承对一个接口与另一个接口进行匹配。
对象适配器依赖于对象组合。
客户使用适配器的过程:
1. 客户通过目标接口调用适配器的方法对适配器发出请求。
2. 适配器使用被适配者接口把请求转换成被施培者的一个或多个调用接口
3. 客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。
模式结构:
类适配器
Cl ient
+speaficRec^jest(
)
+request(j
对象适配器
+speaficRequest(
)
Adapter
举例
(叫声
为
现在假设你缺少鸭子对象 不能公然拿来使用 UML 设计 用一些火鸡对象(叫声为 distanee )”来冒充。显而易见,因为火鸡的接口 (行为)不同,所以我
们
Gobble gob ”l 飞行输出 ” I ' m flying a short
Quae 飞行输出 ”1' m flying!,想 Client
Target
p
1 n
+request()
Adapter
+quack()
编程实现及执行结果:
[cpp] view pla in copy
1. #in clude
2.
3. using namespacStd;
4. //定义鸭子类
5. class Duck
6. {
7. public :
8. virtual void quack(){}; 9. virtual void
fly(){};
10. };
11.
//定义绿头鸭
12. class MallardDuck : public Duck
13. {
14. public :
15. void quack()
16. {
17. cout << "Quack"<< endl;
18.
}
19.
20. void fly()
21. {
22.
cout << "I'm flyi ng" << endl;
Di jck Turkey +quaek^
+flyO
+gobble() +fly()
23. }
24. };
25. //定义火鸡
26. class Turkey
27. {
28. public :
29. virtual void gobble(){}
30. virtual void fiy(){}
31. };
32. //定义野火鸡
33. class WildTurkey : public Turkey
34. {
35. public :
36. void gobble。
37. {
38. cout << "Gobble gobble" << endl;
39. }
40. void fly()
41. {
42. cout << "I'm flyi ng a short dista nee" << en dl;
43. }
44. };
45. //定义火鸡适配器
46. class TurkeyAdapter : public Duck
47. {
48. public :
49. TurkeyAdapter(Turkey* tur):turkey(tur){}
50.
51. void quack()
52. {
53. turkey->gobble();
54. }
55. void fly()
56. {
57. turkey->fly();
58. }
59. private :
60. Turkey* turkey;
61. };
62. //客户代码
63. int main()
64. {
65. Duck* duck = new MallardDuck();
66. duck->quack();
67. duck->fly();
68.
69. Duck* turkeyAdapter = new TurkeyAdapter(iew WildTurkey());
70. turkeyAdapter->quack();
71. turkeyAdapter->fly();
72. return 0;
73. }
执行结果:
Quack
I'mflyi ng
Gobblegobble
I'mflyi ng a short dista nee
请按任意键继续...
适配器和装饰者模式比较:
适配器:将一个接口转成另一个接口。包装某些对象,让它们的接口看起来不像自己而像别的东西。
装饰者:不改变接口,但加入责任。将对象包装起来,让新行为加入类