適配器模式概述
適配器模式(Adapter Pattern)定義:將一個類的介面轉換成客戶希望的另一個介面。適配器模式讓那些不兼容的類可以一起工作。適配器模式是作為兩個不兼容的介面之間的橋樑。這種類型的設計模式屬於結構型模式,兼容多個獨立介面的功能。在生活中用電電壓是220V,但是電腦、手機、LED等設備不會使用高電壓,因此都需要電源適配器將220V轉換成對應的低電壓。其中電源適配器就充當一個適配器的角色。
適配器模式結構
適配器模式結構包含以下幾個角色:
- 適配器類(Adapter):適配器與適配者之間是繼承或實現關係。
- 適配者類(Adaptee):適配器與適配者之間是關聯關係。
- 目標抽象類(Target):定義客戶所需要的介面。
適配器模式UML類圖如下:

模式的應用實例
用適配器模式(Adapter)模擬新能源汽車的發動機。能源汽車的發動機有電能發動機(Electric Motor)和光能發動機(Optical Motor)等,各種發動機的驅動方法不同,例如,電能發動機的驅動方法 ElectricDrive() 是用電能驅動,而光能發動機的驅動方法 OpticalDrive() 是用光能驅動,它們是適配器模式中被訪問的適配者。
客戶端希望用統一的發動機驅動方法 drive() 訪問這兩種發動機,所以必須定義一個統一的目標介面 Motor,然後再定義電能適配器(Electric Adapter)和光能適配器(Optical Adapter)去適配這兩種發動機。

代碼:
// 適配器模式.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include <iostream>
using namespace std;
typedef enum
{
ELECTRIC = 0,
OPTICAL
}ADAPTER_TYPE;
//電機基類
class Adapter
{
public:
Adapter() = default;
virtual ~Adapter() = default;
virtual void Driver() = 0;
};
//電能發動機
class ElectricMotor
{
public:
ElectricMotor() = default;
~ElectricMotor() = default;
void ElectricDrive() { cout << "電能發動機驅動汽車" << endl; }
};
//光能發動機
class OpticalMotor
{
public:
OpticalMotor() = default;
~OpticalMotor() = default;
void OpticalDriver() { cout << "光能發動機驅動汽車" << endl; }
};
class ElectricAdapter : public Adapter
{
public:
ElectricAdapter()
{
pMotor = new ElectricMotor();
}
~ElectricAdapter()
{
if (pMotor)
{
delete pMotor;
pMotor = nullptr;
}
}
void Driver()
{
pMotor->ElectricDrive();
}
private:
ElectricMotor* pMotor;
};
class OpticalAdapter : public Adapter
{
public:
OpticalAdapter()
{
pMotor = new OpticalMotor();
}
~OpticalAdapter()
{
if (pMotor)
{
delete pMotor;
pMotor = nullptr;
}
}
void Driver()
{
pMotor->OpticalDriver();
}
private:
OpticalMotor* pMotor;
};
class AdapterFactory
{
public:
static Adapter* CreateAdapter(ADAPTER_TYPE type)
{
switch (type)
{
case ADAPTER_TYPE::ELECTRIC:
return new ElectricAdapter();
case ADAPTER_TYPE::OPTICAL:
return new OpticalAdapter();
default:
return nullptr;
}
}
};
int main()
{
Adapter* pAdapter = nullptr;
pAdapter = AdapterFactory::CreateAdapter(ELECTRIC);
pAdapter->Driver();
delete pAdapter;
pAdapter = AdapterFactory::CreateAdapter(OPTICAL);
pAdapter->Driver();
delete pAdapter;
return 0;
}適配器模式優缺點
優點
- 更好的復用性:系統需要使用現有的類,而此類的介面不符合系統的需要。那麼通過適配器模式就可以讓這些功能得到更好的復用。
- 透明、簡單:客戶端可以調用同一介面,因而對客戶端來說是透明的。這樣做更簡單 & 更直接
- 更好的擴展性:在實現適配器功能的時候,可以調用自己開發的功能,從而自然地擴展系統的功能。
- 解耦性:將目標類和適配者類解耦,通過引入一個適配器類重用現有的適配者類,而無需修改原有代碼
- 符合開放-關閉原則:同一個適配器可以把適配者類和它的子類都適配到目標介面;可以為不同的目標介面實現不同的適配器,而不需要修改待適配類
缺點
- 過多地使用適配器,會讓系統非常零亂,不易整體進行把握。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/222752.html
微信掃一掃
支付寶掃一掃