終於又進入新的篇章啦!這個轉接器與門面模式也是極度常見與好用(也頗好理解)的模式。
首先轉接器,顧名思義,就是將介面轉換為另一個介面,以滿足用戶端的需求。例如有一個既有的系統與介面,現在來了一個新的類別,它的用途相似,介面卻不同,我們就可以幫它包一層,來轉變為預期的格式。書中有出現非常淺顯易懂的圖示:
圖1
又以最初的最初的鴨子為例,例如目前鴨子的介面如下:
class Duck
{
public:
virtual void quack() = 0;
virtual void fly() = 0;
};
而一般正常的鴨子可以直接實作:
class MallardDuck : public Duck
{
public void quack() override
{
cout << "Quack!" << endl;
}
public void fly() override
{
cout << "Flying!" <<endl;
}
};
但有一隻火雞的行為如下:
class Turkey
{
public:
virtual void gobble() = 0;
virtual void fly() = 0;
};
class WildTurkey: public Turkey
{
public:
void gobble() override
{
cout << "Gobble! Gobble!" <<endl;
}
void fly() override
{
cout << "Flying a little" << endl;
}
};
要怎麼讓Turkey
物件也可以實作Duck
呢?我們可以實作一個轉接器(adapter):
class TurkeyAdapter: public Duck
{
Turkey *turkey;
public:
TurkeyAdapter(Turkey *turkey)
{
this->turkey = turkey;
}
void quack() override
{
turkey->gobble();
}
void fly() override
{
for(int i=0; i<5; ++i)
{
turkey->fly();
}
}
};
接著我們就能試著來使用這個轉接器:
Turkey *turkey = new WildTurkey();
Duck *turkeyAdapter = new TurkeyAdapter(turkey);
cout << "Turkey: " << endl;
turkey->gobble();
turkey->fly();
cout << "Turkey Adapter: " <<endl;
turkeyAdapter->quack();
turkeyAdapter->fly();
/*-----output-----*/
就可以使用讓火雞也適用鴨子的介面,就像一隻鴨子來使用它!
轉接器模式中有三個角色:
轉接器模式的定義如下:
轉接器模式將一個類別的介面轉換成用戶端預期的另一個介面,讓介面不相容的類別得以合作。
而以下則是轉接器模式的架構圖:
圖 2