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

設計模式實作系列(六):Adapter 適配器模式 - 讓不相容介面協同工作

     編輯:關於C++

模式意圖

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

UML 結構圖

類別適配器(繼承)

Adapter Class Pattern

物件適配器(組合)

Adapter Object Pattern

核心解析

  • Target: 客戶期望的介面。
  • Adaptee: 現有不相容介面。
  • Adapter: 實作 Target,內部委派 Adaptee。本實作採用物件適配器(組合),優於類別適配器(繼承)的靈活性。
  • 雙向適配: 若需雙向轉換,可實作雙介面適配器。

C++ 完整實作(物件適配器)

1. Adapter.h

#ifndef ADAPTER_H
#define ADAPTER_H

class Target {
public:
    Target() {}
    virtual ~Target() {}
    virtual void Request() = 0;
};

class Adaptee {
public:
    Adaptee() {}
    ~Adaptee() {}
    void SpecialRequest();
};

class Adapter : public Target {
public:
    Adapter(Adaptee* pAdaptee);
    virtual ~Adapter();
    virtual void Request();
private:
    Adaptee* m_pAdaptee;
};

#endif

2. Adapter.cpp

#include "Adapter.h"
#include <iostream>

void Adaptee::SpecialRequest() {
    std::cout << "SpecialRequest of Adaptee\n";
}

Adapter::Adapter(Adaptee* pAdaptee) : m_pAdaptee(pAdaptee) {}
Adapter::~Adapter() { delete m_pAdaptee; m_pAdaptee = nullptr; }
void Adapter::Request() {
    std::cout << "Request of Adapter\n";
    m_pAdaptee->SpecialRequest(); // 轉發
}

3. Main.cpp

#include "Adapter.h"
#include <cstdlib>

int main() {
    Adaptee* pAdaptee = new Adaptee();
    Target* pTarget = new Adapter(pAdaptee);
    pTarget->Request(); // 透過 Target 介面呼叫 Adaptee 功能
    delete pTarget;
    return 0;
}

現代 C++ 與實務

  • 標準庫:std::stack/std::queue 適配 deque、std::function 適配各種可呼叫物件。
  • 第三方庫整合:將舊 API 適配為新介面,隔離變更影響範圍。
  • 外觀模式 差異:外觀簡化介面,適配器轉換介面使其相容。

適用場景

  • 復用舊類別但介面不符合新系統。
  • 整合第三方庫、硬體驅動、網路協定轉換。
  • 單元測試中 Mock 介面適配真實依賴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved