設計模式---Adapter模式

pamxy發表於2013-06-24

轉自:http://blog.csdn.net/fly542/article/details/6713362

首先對介面卡模式做個簡單的使用說明:

在以下各種情況下使用介面卡模式:
1.系統需要使用現有的類,而此類的介面不符合系統的需要。
2.想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很複雜的介面。
3.(對物件介面卡而言)在設計裡,需要改變多個已有子類的介面,如果使用類的介面卡模式,就要針對每一個子類做一個介面卡,而這不太實際。

其中有兩種基本的方式來實現介面卡模式,a、類繼承方式(下圖一),b、物件方式(下圖2)

(圖1)

 

(圖2)

類繼承方式主要通過Adapter繼承Adaptee來從新包裝Adaptee的SpecificRequest到Adapter的Request函式中實現,

物件方式主要通過Adapter中包含Adaptee物件,在Adapter的Request函式中通過呼叫Adaptee屬性物件來呼叫SpecificRequest函式

 

其中類繼承方式示例程式碼如下

  1. #include <QtCore/QCoreApplication>  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. class Target  
  7. {  
  8. public:  
  9.     Target(){}  
  10.     virtual void request() = 0; /// >子類繼承後實現相應的操作  
  11. };  
  12.   
  13.   
  14. class Adaptee  
  15. {  
  16. public:  
  17.     Adaptee(){}  
  18.     void SpecificRequest()  
  19.     {  
  20.         cout << " 我是特殊的介面,完成一個一般其他介面完成的不好的功能";  
  21.     }  
  22. };  
  23.   
  24. class Adapter : public Target , private Adaptee  
  25. {  
  26. public:  
  27.     Adapter(){}  
  28.     virtual void request()  
  29.     {  
  30.         this->SpecificRequest(); /// >我呼叫特殊物件的功能,因為我繼承了  
  31.     }  
  32. };  
  33.   
  34. int main(int argc, char *argv[])  
  35. {  
  36.     QCoreApplication a(argc, argv);  
  37.   
  38.     Target * myTest = new Adapter;  
  39.     myTest->request();  
  40.     return a.exec();  
  41. }  


物件方式的程式碼大致如下

  1. #include <QtCore/QCoreApplication>  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. class Target  
  7. {  
  8. public:  
  9.     Target(){}  
  10.     virtual void request() = 0; /// >子類繼承後實現相應的操作  
  11. };  
  12.   
  13.   
  14. class Adaptee  
  15. {  
  16. public:  
  17.     Adaptee(){}  
  18.     void SpecificRequest()  
  19.     {  
  20.         cout << " 我是特殊的介面,完成一個一般其他介面完成的不好的功能";  
  21.     }  
  22. };  
  23.   
  24. class Adapter : public Target   
  25. {  
  26. public:  
  27.     Adapter(Adaptee* adaptee){ m_special = adaptee}  
  28.     virtual void request()  
  29.     {  
  30.         m_special->SpecificRequest(); /// >我呼叫特殊物件的功能,因為我繼承了  
  31.     }  

相關文章