首先對適配器模式做個簡單的使用說明:
在以下各種情況下使用適配器模式:
1.系統需要使用現有的類,而此類的介面不符合系統的需要。
2.想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。這些源類不一定有很複雜的介面。
3.(對對象適配器而言)在設計裡,需要改變多個已有子類的介面,如果使用類的適配器模式,就要針對每一個子類做一個適配器,而這不太實際。
其中有兩種基本的方式來實現適配器模式,a、類繼承方式(一),b、對象方式(2)
(圖1)
(圖2)
類繼承方式主要通過Adapter繼承Adaptee來從新封裝Adaptee的SpecificRequest到Adapter的Request函數中實現,
對象方式主要通過Adapter中包含Adaptee對象,在Adapter的Request函數中通過調用Adaptee屬性對象來調用SpecificRequest函數
其中類繼承方式範例程式碼如下
#include <QtCore/QCoreApplication>#include <iostream>using namespace std;class Target{public: Target(){} virtual void request() = 0; /// >子類繼承後實現相應的操作};class Adaptee{public: Adaptee(){} void SpecificRequest() { cout << " 我是特殊的介面,完成一個一般其他介面完成的不好的功能"; }};class Adapter : public Target , private Adaptee{public: Adapter(){} virtual void request() { this->SpecificRequest(); /// >我調用特殊對象的功能,因為我繼承了 }};int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); Target * myTest = new Adapter; myTest->request(); return a.exec();}
對象方式的代碼大致如下
#include <QtCore/QCoreApplication>#include <iostream>using namespace std;class Target{public: Target(){} virtual void request() = 0; /// >子類繼承後實現相應的操作};class Adaptee{public: Adaptee(){} void SpecificRequest() { cout << " 我是特殊的介面,完成一個一般其他介面完成的不好的功能"; }};class Adapter : public Target {public: Adapter(Adaptee* adaptee){ m_special = adaptee} virtual void request() { m_special->SpecificRequest(); /// >我調用特殊對象的功能,因為我繼承了 }private: Adaptee * m_special;};int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); Target * myTest = new Adapter; myTest->request(); return a.exec();}