首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 設計模式:適配器模式深度解析——接口不兼容的橋梁

     編輯:關於C++

模式定義

適配器模式:將一個類的接口轉換為客戶期望的另一個接口,使接口不兼容的類能夠協同工作。屬於結構型模式。

兩種實現形式

類型實現方式優點缺點
類適配器多重繼承:同時繼承 Target 和 Adaptee可重寫 Adaptee 方法;無需指針間接訪問C++ 多重繼承複雜;無法適配 Adaptee 子類
對象適配器單繼承 Target + 聚合 Adaptee 指針可適配 Adaptee 及其所有子類;符合組合優於繼承需委託調用,略微間接

推薦使用對象適配器(GoF 推薦),靈活性更高。

核心結構

  • Target:客戶期望的接口(如 request())。
  • Adaptee:現有不兼容接口(如 specificRequest())。
  • Adapter:實現 Target,內部持有 Adaptee,將 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(); }
};

經典應用場景

  1. 第三方庫接口適配:系統需用 Target 接口,第三方庫提供 Adaptee,編寫 Adapter 封裝。
  2. 舊系統遷移:新系統定義新接口,舊類不修改,寫適配器複用舊邏輯。
  3. 標準庫:std::stack/queue 適配 deque;std::reverse_iterator 適配正向迭代器。
  4. 跨平台抽象層:統一接口適配不同平台實現。

適配器 vs 裝飾器 vs 橋接

模式意圖接口關系
適配器接口轉換Target ≠ Adaptee
裝飾器動態增強Decorator = Component (同接口)
橋接抽象與實現分離Abstraction 聚合 Implementor (不同維度)

優缺點

  • 優點:復用現有類、解耦目標接口與實現、符合開閉原則(新增適配器不修改舊代碼)。
  • 缺點:過度使用導致系統碎片化、調試時需穿透適配層。

總結

適配器模式是接口不兼容時的「翻譯官」。核心:實現 Target 接口,聚合 Adaptee,請求轉發。對象適配器靈活性優於類適配器。實戰中,適配器常作為防腐層隔離外部依賴變化,是架構演進的關鍵工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved