码迷,mamicode.com
首页 > 编程语言 > 详细

23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

时间:2016-07-22 22:58:05      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

2016-07-22

(www.cnblogs.com/icmzn)


模式理解

技术分享

 1. Adapter 定义
    将一个类的接口变换为客户端所期待的另一种接口形式,使被适配者Adaptee能用用在目标target的环境中
    一般可以分为以下角色:
    (1)Target角色:
        定义把其他类或者对象转化为的目标接口。通常为一个抽象类(接口)。
    (2)Adaptee角色:
        定义被转化的类,它是已经存在的类或者对象
    (3)Adapte角色:
        通过继承Adaptee或者关联组合Adaptee的方式,适配Target目标
    通常适配器实在系统维护后期的系统扩展应用的。

2. Adapter 优点
(1)强两个没有关系的类适配在一起使用使用。提高复用度,维护系统容易,灵活性好。
(2)增加透明度,即把taget的接口实现,委托给了具体的adaptee完成。

3. Adapter 适应条件
(1)系统扩展后期,使用一个现有类或者原来的类,适配新接口或者原来的接口的时候。

4. Adapter 讨论与注意问题
(1)适配器模式的两种实现方式区别:类继承适配器方式与对象适配器方式
    这是面向对象领域的重要概念。
    类继承适配器是通过继承Adaptee方式(private)获取Adaptee的接口以及实现,
即如果以private继承则只获取了实现,如果以public继承则同时也获取了接口,父类接口可以在子类中提供服务。
则可以通过纯虚类继承实现接口继承。
    对象适配器方式,是通过Adapter组合的方式通过adaptee成员获取相应的接口内容,然后适配目标对象的接口。
(2)类继承适配器是类之间的继承关系;而对象适配器是类之间通过组合形成的关联关系。


 程序实现(C++)

 Adapte.h

 1 #pragma once
 2 
 3 //适配器定义
 4 /*
 5     两种适配器定义
 6     (1)类适配器方式:adapter私有继承adaptee(或抽象类),并实现target的接口(继承抽象类)
 7     (2)对象适配器方式:datapter组合adaptee对象,并实现target的接口(继承抽象类)
 8 */
 9 #include "TargetAdptee.h"
10 
11 class CClassAdepter :public CAdbTarger, private CAdeptee
12 {
13 public:
14     CClassAdepter(int age) :CAdeptee(age){};
15 public:
16     void request() override
17     {
18         //调用类适配器的被适配者
19         doMyWay();
20     }
21 
22 };
23 
24 
25 class CObjectAdatper : public CAdbTarger
26 {
27 public:
28     CObjectAdatper()
29     {
30         m_pAdaptee = nullptr;
31     };
32 
33     CObjectAdatper(CAdeptee* pAdaptee)
34     {
35         m_pAdaptee = pAdaptee;
36     }
37     ~CObjectAdatper()
38     {
39         delete m_pAdaptee;
40     }
41 public:
42     void request() override
43     {
44         _ASSERT(m_pAdaptee);
45         //调用类适配器的被适配者
46         m_pAdaptee->doMyWay();
47     }
48 
49 
50 private:
51     CAdeptee* m_pAdaptee;
52 
53 };

TargetAdptee

 1 #pragma once
 2 
 3 #include <iostream>
 4 using namespace std;
 5 //目标类,被适配类
 6 class CAdbTarger
 7 {
 8 public:
 9     virtual void request() = 0;
10 };
11 
12 class CAdeptee 13 { 14 public: 15 CAdeptee(int age) :m_iAge(age){}; 16 public: 17 //被适配的方法 18 void doMyWay() 19 { 20 cout << "我的借口实现,以adeptee方式实现...." << m_iAge << endl; 21 } 22 private: 23 int m_iAge; 24 };

 


(1)模板应用

 main.cpp

 1 // Adapter.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "AdepterDef.h"
 6 #include <iostream>
 7 using namespace std;
 8 
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11     cout << "类适配器方式" << endl;
12     CClassAdepter* pAdapter = new CClassAdepter(26);
13     pAdapter->request();
14     delete pAdapter;
15     cout << "对象适配器方式" << endl;
16     CObjectAdatper *pObj = new CObjectAdatper(new CAdeptee(28));
17     pObj->request();
18     delete pObj;
19 
20     system("pause");
21     return 0;
22 }

 

(2)输出展示

 技术分享

 

23 DesignPatterns学习笔记:C++语言实现 --- 2.2 Adapter

标签:

原文地址:http://www.cnblogs.com/icmzn/p/5697190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!