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

C++ 設計模式:適配器模式深度解析與類/物件適配器對比實作

     編輯:關於C語言

適配器模式將不相容介面轉換為客戶期望介面,讓原本無法合作的類別能協同工作。本文以筆電電源適配器、日規 110V 轉接頭為生活類比,詳解類/物件適配器兩種形式、優劣對比與 C++ 完整實作。

生活類比

  • 筆電電源適配器:220V/110V 市電 → 19V 直流,筆電才能充電。
  • 赴日出差:日本 110V 插座,國產 220V 筆電需電壓轉換器(適配器)才能使用。

模式定義

將一個類的介面轉換成客戶希望的另一個介面。適配器模式使得原本因介面不相容而不能一起工作的那些類可以一起工作。—— GoF

適用場景

  1. 使用既有類別,但其介面不符合需求。
  2. 雙方(調用者/提供者)介面皆難以修改時,在中間加入適配層。

優點

  1. 降低實作難度:復用既有類別,避免重寫。
  2. 提高專案品質:既有類別通常經過測試,適配後無需全量回歸測試。
  3. 提升效率、降低成本。

UML:類適配器(多重繼承)

類適配器 UML

  • Adapter 同時繼承 Target 與 Adaptee。
  • 覆寫 Request() 內部呼叫 Adaptee::SpecificRequest()。

UML:物件適配器(組合/委派)

物件適配器 UML

  • Adapter 繼承 Target,內含 Adaptee* 成員。
  • Request() 委派給 m_Adaptee->SpecificRequest()。

兩種形式對比

維度類適配器物件適配器
實作方式多重繼承組合/委派
可重新定義 Adaptee 行為是(覆寫 virtual 函式)否(需子類別化 Adaptee)
Adaptee 新增抽象方法影響Adapter 需同步修改(高耦合)Adapter 無需修改(低耦合)
支援 Adaptee 子類別多型否是(持有基類指標)
建構 Adaptee 難易度自動(繼承)需外部提供/建構
推薦度低高(GoF/現代 C++ 偏好組合)

C++ 類適配器實作

class Target { public: virtual void Request() { cout << "Target::Request" << endl; } };
class Adaptee { public: void SpecificRequest() { cout << "Adaptee::SpecificRequest" << endl; } };
class Adapter : public Target, private Adaptee {  // 私有繼承隱藏 Adaptee 介面
public:
    void Request() override { Adaptee::SpecificRequest(); }
};

C++ 物件適配器實作

class Target { public: virtual ~Target() {} virtual void Request() { cout << "Target::Request" << endl; } };
class Adaptee { public: void SpecificRequest() { cout << "Adaptee::SpecificRequest" << endl; } };
class Adapter : public Target {
    Adaptee *m_Adaptee;
public:
    Adapter() : m_Adaptee(new Adaptee) {}
    ~Adapter() { delete m_Adaptee; }
    void Request() override { m_Adaptee->SpecificRequest(); }
};

現代 C++ 改良

  • 使用 std::unique_ptr<Adaptee> 管理生命週期。
  • 建構函數接受 std::unique_ptr<Adaptee>(移動語意)或 Adaptee*(非擁有),靈活支援注入。
  • 若 Target 為純介面(所有方法 = 0),適配器實作更乾淨。

總結

適配器模式是「介面不匹配」的標準解法。優先選擇物件適配器(組合),獲得低耦合、多型支援、符合「組合優於繼承」原則。生活中無處不在的轉接頭,正是此模式最生動的註腳。

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