介面卡模式
將類的介面轉換為客戶期望的另一個介面。介面卡(或包裝器)允許類一起工作,否則由於不相容的介面。介面卡模式的動機是,如果我們可以修改介面,我們可以重用現有的軟體。
- 
介面卡模式依賴於物件組合。 
- 
客戶端呼叫 Adapter 物件上的操作。 
- 
介面卡呼叫 Adaptee 來執行操作。 
- 
在 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)
程式碼摘要:
- 
客戶認為他正在和一個人交談 
- 
目標是 Rectangle類。這是客戶端呼叫方法的內容。Rectangle *r = new RectangleAdapter(x,y,w,h); r->draw();
- 
請注意,介面卡類使用多重繼承。 class RectangleAdapter: public Rectangle, private LegacyRectangle { ... }
- 
介面卡 RectangleAdapter允許LegacyRectangle通過繼承 BOTH 類來響應請求(draw()在Rectangle上)。
- 
LegacyRectangle類沒有與Rectangle相同的方法(draw()),但是Adapter(RectangleAdapter)可以接受Rectangle方法呼叫並轉向並呼叫LegacyRectangle,oldDraw()上的方法。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 具有不同的意圖:它旨在將介面與其實現分離,以便可以輕鬆且獨立地改變它們。一個介面卡是為了改變介面的的現有物件。