介面卡模式

將類的介面轉換為客戶期望的另一個介面。介面卡(或包裝器)允許類一起工作,否則由於不相容的介面。介面卡模式的動機是,如果我們可以修改介面,我們可以重用現有的軟體。

  1. 介面卡模式依賴於物件組合。

  2. 客戶端呼叫 Adapter 物件上的操作。

  3. 介面卡呼叫 Adaptee 來執行操作。

  4. 在 STL 中,堆疊適用於向量:當堆疊執行 push() 時,底層向量執行 vector :: push_back()

例:

#include <iostream>

// Desired interface (Target)
class Rectangle 
{
  public:
    virtual void draw() = 0;
};

// Legacy component (Adaptee)
class LegacyRectangle 
{
  public:
    LegacyRectangle(int x1, int y1, int x2, int y2) {
        x1_ = x1;
        y1_ = y1;
        x2_ = x2;
        y2_ = y2;
        std::cout << "LegacyRectangle(x1,y1,x2,y2)\n";
    }
    void oldDraw() {
        std::cout << "LegacyRectangle:  oldDraw(). \n";
    }
  private:
    int x1_;
    int y1_;
    int x2_;
    int y2_;
};

// Adapter wrapper
class RectangleAdapter: public Rectangle, private LegacyRectangle 
{
  public:
    RectangleAdapter(int x, int y, int w, int h):
      LegacyRectangle(x, y, x + w, y + h) {
         std::cout << "RectangleAdapter(x,y,x+w,x+h)\n";
      }

    void draw() {
        std::cout << "RectangleAdapter: draw().\n"; 
        oldDraw();
    }
};

int main()
{
  int x = 20, y = 50, w = 300, h = 200;
  Rectangle *r = new RectangleAdapter(x,y,w,h);
  r->draw();
}

//Output:
//LegacyRectangle(x1,y1,x2,y2)
//RectangleAdapter(x,y,x+w,x+h)

程式碼摘要:

  1. 客戶認為他正在和一個人交談

  2. 目標是 Rectangle 類。這是客戶端呼叫方法的內容。

     Rectangle *r = new RectangleAdapter(x,y,w,h);
     r->draw();
    
  3. 請注意,介面卡類使用多重繼承。

     class RectangleAdapter: public Rectangle, private LegacyRectangle {
         ...
     }
    
  4. 介面卡 RectangleAdapter 允許 LegacyRectangle 通過繼承 BOTH 類來響應請求(draw()Rectangle 上)。

  5. LegacyRectangle 類沒有與 Rectangle 相同的方法(draw()),但是 Adapter(RectangleAdapter) 可以接受 Rectangle 方法呼叫並轉向並呼叫 LegacyRectangleoldDraw() 上的方法。

     class RectangleAdapter: public Rectangle, private LegacyRectangle {
       public:
         RectangleAdapter(int x, int y, int w, int h):
           LegacyRectangle(x, y, x + w, y + h) {
             std::cout << "RectangleAdapter(x,y,x+w,x+h)\n";
           }
    
         void draw() {
             std::cout << "RectangleAdapter: draw().\n"; 
             oldDraw();
         }
     };
    

介面卡設計模式將一個類的介面轉換為相容但不同的介面。因此,這與代理模式類似,因為它是單元件包裝器。但是介面卡類和原始類的介面可能不同。

正如我們在上面的示例中看到的,此介面卡模式對於為現有 API 公開不同的介面以允許其與其他程式碼一起使用非常有用。此外,通過使用介面卡模式,我們可以採用異構介面,並對它們進行轉換以提供一致的 API。

Bridge 模式具有類似於物件介面卡的結構,但 Bridge 具有不同的意圖:它旨在介面與其實現分離,以便可以輕鬆且獨立地改變它們。一個介面卡是為了改變介面的的現有物件。