適配器模式(Adapter Pattern)是一種結構型設計模式,用于將一個類的接口轉換成客戶端期望的另一個接口,使原本不兼容的類可以一起工作。
適配器模式的類型
類適配器(通過多重繼承實現)
對象適配器(通過組合實現,更常用)
示例代碼
1. 對象適配器示例(推薦方式)
#include <iostream>// 目標接口(客戶端期望的接口)
class Target {
public:virtual ~Target() = default;virtual void request() const {std::cout << "Target: 標準請求\n";}
};// 需要適配的類(不兼容的接口)
class Adaptee {
public:void specificRequest() const {std::cout << "Adaptee: 特殊請求\n";}
};// 適配器類(將Adaptee接口轉換為Target接口)
class Adapter : public Target {
private:Adaptee* adaptee;
public:Adapter(Adaptee* a) : adaptee(a) {}void request() const override {std::cout << "Adapter: 轉換請求\n";adaptee->specificRequest();}
};int main() {Adaptee* adaptee = new Adaptee();Target* target = new Adapter(adaptee);target->request(); // 客戶端調用統一的接口delete target;delete adaptee;return 0;
}
2. 類適配器示例(需要多重繼承)
#include <iostream>// 目標接口
class Target {
public:virtual ~Target() = default;virtual void request() const {std::cout << "Target: 標準請求\n";}
};// 需要適配的類
class Adaptee {
public:void specificRequest() const {std::cout << "Adaptee: 特殊請求\n";}
};// 類適配器(通過多重繼承)
class Adapter : public Target, private Adaptee {
public:void request() const override {std::cout << "Adapter: 轉換請求\n";specificRequest(); // 調用Adaptee的方法}
};int main() {Target* target = new Adapter();target->request();delete target;return 0;
}
?UML結構
?
要點總結
1、Adapter模式主要應用于“希望復用一些現存的類,但是接口又與復用環境要求不一致的情況”,在遺留代碼復用、類庫遷移等方面非常有用。
2、GoF 23 定義了兩種Adapter模式的實現結構:對象適配器和類適配器。但類適配器采用“多繼承”的實現方式,一般不推薦使用。對象適配器采用“對象組合”的方式,更符合松耦合精神。
3、Adapter模式可以實現的非常靈活,不必拘泥于Gof23中定義的兩種結構。例如,完全可以將Adapter模式中的“現存對象”作為新的接口方法參數,來達到適配的目的。?
適配器模式的應用場景
需要使用現有類,但其接口與你的代碼不兼容時
想復用一些現有的子類,但這些子類缺少一些公共功能
需要統一多個不同類的接口
優點
單一職責原則:可以將接口轉換代碼與業務邏輯分離
開閉原則:可以在不修改現有代碼的情況下引入新的適配器
缺點
代碼整體復雜度增加:需要新增一系列接口和類
?
適配器模式在C++標準庫中也有應用,例如stack
和queue
就是通過適配其他容器(如deque
)實現的。?