iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
自我挑戰組

設計模式探索系列 第 21

[Day 21] 轉接器與門面模式 (1)

  • 分享至 

  • xImage
  •  

物件導向轉接器

終於又進入新的篇章啦!這個轉接器與門面模式也是極度常見與好用(也頗好理解)的模式。
首先轉接器,顧名思義,就是將介面轉換為另一個介面,以滿足用戶端的需求。例如有一個既有的系統與介面,現在來了一個新的類別,它的用途相似,介面卻不同,我們就可以幫它包一層,來轉變為預期的格式。書中有出現非常淺顯易懂的圖示:

圖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-----*/


就可以使用讓火雞也適用鴨子的介面,就像一隻鴨子來使用它!

轉接器模式

轉接器模式中有三個角色:

  • 用戶端(Client): 用戶端針對目標介面實作。用戶端使用目標介面呼叫轉接器,對轉接器發出請求。
  • 轉接器(Adapter): 轉接器實作目標介面,並持有被轉接者的實例。轉接器使用被轉接者的介面,將請求轉換成對被轉接者的呼叫。
  • 被轉接者(Adaptee): 被轉接者進行呼叫,用戶端看到呼叫結果,但不會有感轉接器在過程中進行轉換。

轉接器模式的定義如下:

轉接器模式將一個類別的介面轉換成用戶端預期的另一個介面,讓介面不相容的類別得以合作

而以下則是轉接器模式的架構圖:

圖 2


上一篇
[Day 20] 命令模式 (4)
下一篇
[Day 22] 轉接器與門面模式 (2)
系列文
設計模式探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言