介面卡模式
將類的介面轉換為客戶期望的另一個介面。介面卡(或包裝器)允許類一起工作,否則由於不相容的介面。介面卡模式的動機是,如果我們可以修改介面,我們可以重用現有的軟體。
-
介面卡模式依賴於物件組合。
-
客戶端呼叫 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 具有不同的意圖:它旨在將介面與其實現分離,以便可以輕鬆且獨立地改變它們。一個介面卡是為了改變介面的的現有物件。