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

Adapter 同時繼承 Target 與 Adaptee。Request() 內部呼叫 Adaptee::SpecificRequest()。
Adapter 繼承 Target,內含 Adaptee* 成員。Request() 委派給 m_Adaptee->SpecificRequest()。| 維度 | 類適配器 | 物件適配器 |
|---|---|---|
| 實作方式 | 多重繼承 | 組合/委派 |
| 可重新定義 Adaptee 行為 | 是(覆寫 virtual 函式) | 否(需子類別化 Adaptee) |
| Adaptee 新增抽象方法影響 | Adapter 需同步修改(高耦合) | Adapter 無需修改(低耦合) |
| 支援 Adaptee 子類別多型 | 否 | 是(持有基類指標) |
| 建構 Adaptee 難易度 | 自動(繼承) | 需外部提供/建構 |
| 推薦度 | 低 | 高(GoF/現代 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(); }
};
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(); }
};
std::unique_ptr<Adaptee> 管理生命週期。std::unique_ptr<Adaptee>(移動語意)或 Adaptee*(非擁有),靈活支援注入。 Target 為純介面(所有方法 = 0),適配器實作更乾淨。適配器模式是「介面不匹配」的標準解法。優先選擇物件適配器(組合),獲得低耦合、多型支援、符合「組合優於繼承」原則。生活中無處不在的轉接頭,正是此模式最生動的註腳。