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)输出展示