1.意圖 將一個類介面轉換成客戶希望的另外一個介面。Adapter模式使那些原本不能一起工作的類,可以一起工作。 2.別名 包裝器 Wrapper. 3.動機 一個應用可能會有一些類具有不同的介面,並且這些介面互不相容,可以專門定義一個類,用來適配互不相容的類。 4.適用性 你想使用一個已經存在的類 ...
1.意圖
將一個類介面轉換成客戶希望的另外一個介面。Adapter模式使那些原本不能一起工作的類,可以一起工作。
2.別名
包裝器 Wrapper.
3.動機
一個應用可能會有一些類具有不同的介面,並且這些介面互不相容,可以專門定義一個類,用來適配互不相容的類。
4.適用性
- 你想使用一個已經存在的類,而它的介面不符合你的需求。
- 你想創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類協同工作。
- 你想使用一些已經存在的子類,但是不可能對每一個都進行子類化以匹配它們的介面。對象適配器可以適配它的父類介面。
5.結構
6.代碼實例
1.對象適配器
class Adaptee { public: void SpecificRequest(); };
class Target { public: virtual void Request()=0; virtual void Initilaize()=0; };
#include "Target.h" #include <memory> class Adaptee; class Adapter : public Target { public: void Request(); void Initilaize(); std::shared_ptr<Adaptee> m_pAdaptee; };
#include <iostream> #include "Adaptee.h" void Adaptee::SpecificRequest() { std::cout << "SpecificRequest" << std::endl; }
#include "Adaptee.h" #include "Adapter.h" void Adapter::Request() { m_pAdaptee->SpecificRequest(); } void Adapter::Initilaize() { m_pAdaptee = std::shared_ptr<Adaptee>(new Adaptee); }
#include "Adapter.h" int main() { std::shared_ptr<Adapter> pAdapter(new Adapter); std::shared_ptr<Target> pTarget = std::dynamic_pointer_cast<Target>(pAdapter); pTarget->Initilaize(); pTarget->Request(); while(1); }
測試結果:
2.類適配器
#include "Target.h" #include "Adaptee.h" class AdapterClass : public Target,private Adaptee { public : void Request(); void Initilaize(); };
以上代碼為類適配器,公有繼承Target,私有繼承Adaptee,即只繼承Adaptee的實現,不繼承其介面。
#include "AdapterClass.h" void AdapterClass:: Request() { SpecificRequest(); } void AdapterClass::Initilaize() { }
以上為類適配器的實現,在Request中調用Adaptee的SpecifiRequest。
#include "Adapter.h" int main() { std::shared_ptr<Adapter> pAdapter(new Adapter); //std::shared_ptr<Target> pTarget = std::dynamic_pointer_cast<Target>(pAdapter); //pTarget->Initilaize(); pAdapter->Request(); while(1); }
測試代碼,直接調用Adapter的Request從而能夠達到目的。
7.效果
類適配器:
- 用一個具體的Adapter類對Adaptee和Target進行匹配。結果是當我們想要匹配一個類以及所有它的子類時,類Adapter將不能工作。
- 使得Adapter可以重定義Adaptee的部分行為,因為Adapter是Adaptee的一個子類。
- 僅僅引入了一個對象,並不需要額外的指針以間接得到Adaptee.
對象適配器:
- 允許一個Adapter同時與多個Adaptee同時工作。
- 使得重定義Adaptee的行為比較困難。