將一個接口轉換成客戶希望的另一個接口使得接口不兼容的那些類可以一起工作
適配器模式是我個人使用頻率比較高的模式,十分簡單實用。在許多情況下,我們自己的系統A,要使用既有對象B的接口,但無奈我們的既有系統A和B接口不兼容,這時候適配器可以幫我們解決這個問題。
假設現在有一個函數
static void request(Target *target)
{
target->request();
}
現在我們既有的類Target::request
已經無法滿足我們的需求,於是從第三方拿到了一個可以滿足需求的Adaptee
類,可惜該類沒有request
而只有一個request
方法。於是我們需要將Adataptee
包裝成一個Adapter
類提供一個request
接口,同時包裝類是一個Target
類的子類,這樣就可以滿足需求了,這種包裝有兩種思路,一種是使用多繼承,同時繼承Target
和Adaptee
類,一種是使用單繼承,繼承Target
然後關聯一個Adaptee
。這就是我們說說的 適配器模式,兩種思路分別叫做類適配器模式和對象適配器模式。 其UML類圖如下:
類適配器
對象適配器
示例代碼如下:
#include
#include
using std::string;
class Target {
public:
virtual ~Target (){};
virtual void request(){
std::cout << "request = Target::request" << std::endl;
}
};
class Adaptee {
public:
virtual ~Adaptee (){};
virtual void specificRequest(){
std::cout << "request = Adaptee::request" << std::endl;
}
};
#ifdef CLASS_ADAPTER
class Adapter :public Target, public Adaptee {
public:
virtual ~Adapter (){};
virtual void request(){
specificRequest();
}
};
#else
class Adapter :public Target {
private:
Adaptee *daptee;
public:
Adapter():daptee(new Adaptee){}
virtual ~Adapter(){};
virtual void request(){
daptee->specificRequest();
}
};
#endif
static void request(Target *target)
{
target->request();
}
int main(void)
{
Target *target;
target = new Target;
request(target);
target = new Adapter;
request(target);
}
運行結果:
request = Target::request
request = Adaptee::request