適配器模式:將一個類的接口轉換為客戶期望的另一個接口,使接口不兼容的類能夠協同工作。屬於結構型模式。
| 類型 | 實現方式 | 優點 | 缺點 |
|---|---|---|---|
| 類適配器 | 多重繼承:同時繼承 Target 和 Adaptee | 可重寫 Adaptee 方法;無需指針間接訪問 | C++ 多重繼承複雜;無法適配 Adaptee 子類 |
| 對象適配器 | 單繼承 Target + 聚合 Adaptee 指針 | 可適配 Adaptee 及其所有子類;符合組合優於繼承 | 需委託調用,略微間接 |
推薦使用對象適配器(GoF 推薦),靈活性更高。
request())。specificRequest())。request() 轉發為 specificRequest()。// Target 接口
class Target {
public:
virtual ~Target() {}
virtual void request() { cout << "Target::request\n"; }
};
// Adaptee 現有類
class Adaptee {
public:
virtual ~Adaptee() {}
void specificRequest() { cout << "Adaptee::specificRequest\n"; }
};
// Adapter 適配器
class Adapter : public Target {
Adaptee* adaptee;
public:
Adapter() : adaptee(new Adaptee()) {}
~Adapter() { delete adaptee; }
void request() override {
adaptee->specificRequest(); // 接口轉換
}
};
// 客戶端代碼
void clientCode(Target* t) {
t->request();
}
int main() {
Target* t1 = new Target();
clientCode(t1); // Target::request
Target* t2 = new Adapter();
clientCode(t2); // Adaptee::specificRequest (透過適配器)
}
class ClassAdapter : public Target, private Adaptee {
public:
void request() override { specificRequest(); }
};
Target 接口,第三方庫提供 Adaptee,編寫 Adapter 封裝。std::stack/queue 適配 deque;std::reverse_iterator 適配正向迭代器。| 模式 | 意圖 | 接口關系 |
|---|---|---|
| 適配器 | 接口轉換 | Target ≠ Adaptee |
| 裝飾器 | 動態增強 | Decorator = Component (同接口) |
| 橋接 | 抽象與實現分離 | Abstraction 聚合 Implementor (不同維度) |
適配器模式是接口不兼容時的「翻譯官」。核心:實現 Target 接口,聚合 Adaptee,請求轉發。對象適配器靈活性優於類適配器。實戰中,適配器常作為防腐層隔離外部依賴變化,是架構演進的關鍵工具。