uml適用於各種軟體開發方法:uml和模式應用考試

適配器模式概述

適配器模式(Adapter Pattern)定義:將一個類的介面轉換成客戶希望的另一個介面。適配器模式讓那些不兼容的類可以一起工作。適配器模式是作為兩個不兼容的介面之間的橋樑。這種類型的設計模式屬於結構型模式,兼容多個獨立介面的功能。在生活中用電電壓是220V,但是電腦、手機、LED等設備不會使用高電壓,因此都需要電源適配器將220V轉換成對應的低電壓。其中電源適配器就充當一個適配器的角色。

適配器模式結構

適配器模式結構包含以下幾個角色:

  • 適配器類(Adapter):適配器與適配者之間是繼承或實現關係。
  • 適配者類(Adaptee):適配器與適配者之間是關聯關係。
  • 目標抽象類(Target):定義客戶所需要的介面。

適配器模式UML類圖如下:

C++設計模式——適配器模式

模式的應用實例

用適配器模式(Adapter)模擬新能源汽車的發動機。能源汽車的發動機有電能發動機(Electric Motor)和光能發動機(Optical Motor)等,各種發動機的驅動方法不同,例如,電能發動機的驅動方法 ElectricDrive() 是用電能驅動,而光能發動機的驅動方法 OpticalDrive() 是用光能驅動,它們是適配器模式中被訪問的適配者。

客戶端希望用統一的發動機驅動方法 drive() 訪問這兩種發動機,所以必須定義一個統一的目標介面 Motor,然後再定義電能適配器(Electric Adapter)和光能適配器(Optical Adapter)去適配這兩種發動機。

C++設計模式——適配器模式

代碼:

// 適配器模式.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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:12
下一篇 2024-12-09 14:12

相關推薦

發表回復

登錄後才能評論