日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++结构型模式-适配器模式

發布時間:2023/12/18 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++结构型模式-适配器模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.1 基本概念

適配器模式(Adapter Pattern):或稱為包裝器(Wrapper)將一個接口轉換為客戶希望的另一個接口,適配器模式使接口不兼容的那些類可以一起工作,

適配器模式包括類適配器和對象適配器。

1.2 模式結構

1、Target(目標抽象類) :目標抽象類定義客戶要用的特定領域的接口,可以是個抽象類或接口,也可以是個具體類;

2、Adapter(適配器類):可以調用另一個接口,作為一個轉換器,對適配者類和目標抽象類進行適配。

(1)類適配器中,適配器類通過實現Target接口并繼承 Adaptee類,使得兩者產生聯系;

(2)對象適配器類中,適配器類通過繼承Target,并關聯一個Adaptee對象使兩者產生聯系;

3、Adaptee (適配者類)

被適配的角色,它定義了一個已經存在的接口,這個接口需要適配。

4、Client(客戶類)

針對目標抽象類進行編程,調用在抽象目標類中定義的業務方法。

(1)類適配器模式結構:適配器類Adapter,實現了抽象目標類(Target)接口,并繼承了適配者類(Adaptee),在適配器類 的request()方法中調用所繼承的適配者類(Adaptee)的SpeaificRequest()方法,實現了適配的目的。

(2)對象適配器模式結構

?為了使客戶端能夠使用適配者類Adapte 的 spcificRequest()方法,需要提供一個適配器類Adapter,這個適配器類包裝了一個適配者的實例,從而將客戶端和適配者銜接起來,在適配器的request()方法中調用適配者的?spcificRequest()方法。適配器類和適配者類為關聯關系。

1.3 優缺點

優點:

  • 將目標類和適配器類解耦。通過引入一個適配器類來重用現有的適配者類,而無須修改原有的代碼。
  • 增加了類的透明性和復用性,將具體的實現封裝在適配器類中,對于客戶端類來說是透明的,而且提高了適配器的復用性。
  • 靈活性和擴展性都非常好,符合開閉原則
  • 缺點:

  • 一次最多只能適配一個適配器類,不能同時適配多個適配器。
  • 適配器類不能為最終類。
  • 目標抽象類只能為接口,不能為類,其使用有一定的局限性。
  • 1.4 應用場景

    (1)系統需要使用現有的類,而這些類的接口不符合系統的需求;

    (2)數據庫鏈接工具JDBC,使得使用Java語言程序能夠與數據庫鏈接,并使用SQL語言來查詢和操作數據庫。

    1.5 實例

    1.5.1 類適配器模式

    設計一個可以模擬各種動物的機器人,在機器人中定義了一系列方法,如機器人叫喊 cry()方法,機器人移動方法 move,現在在不修改已有代碼的情況下,使得機器人能夠像狗一樣,叫 wang()和跑 move()

    #include <iostream> using namespace std; /*目標抽象類RobotTarget 機器人接口*/ class RobotTarget{ public:RobotTarget(){};virtual void cry()=0;virtual void move()=0;~RobotTarget(){}; };/*適配者類 DogAdaptee*/ class DogAdaptee{ public: DogAdaptee(){} virtual void wang() {cout<<"wang wang"<<endl; }virtual void run() {cout<<"run run"<<endl; } };/*適配器類 仿生狗 DogAdapter*/ class DogAdapter: public RobotTarget, public DogAdaptee{ public:DogAdapter(){};virtual void cry(){wang();}virtual void move(){run();} };int main() {//對象適配器RobotTarget* robot= new DogAdapter();robot->cry();robot->move();delete robot;return 0; }

    1.5.2 對象適配器模式

    英式插座與中式插座規格不同,如何在不修改英式插座的基礎上轉換為中式插座。

    #include <iostream> #include <string>using namespace std;//目標抽象類 CCnOutlet中式插座 class CCnOutlet { public:virtual ~CCnOutlet(){}virtual void Cnplug() = 0; };//適配者類 CEnOutlet class CEnOutlet { public:virtual ~CEnOutlet(){}virtual void Enplug(){cout << "British socket!" << endl;} };//適配器類 class CCnOutletAdapter : public CCnOutlet { public:CCnOutletAdapter(CEnOutlet *pEnOutlet) : m_pEnOutlet(pEnOutlet){};virtual ~CCnOutletAdapter(){};virtual void Cnplug(){m_pEnOutlet->Enplug();cout << "adapter" << endl;}private:CEnOutlet *m_pEnOutlet; };int main(int argc, char **argv) {CEnOutlet *pEnOutlet = new CEnOutlet;CCnOutlet *pCnOutlet = new CCnOutletAdapter(pEnOutlet);//英式插座適配中式插座pCnOutlet->Cnplug();delete pEnOutlet;delete pCnOutlet;return 0; }

    參考文獻:

    【1】https://www.jianshu.com/p/b8d3142772e0

    【2】C++設計模式-Adapter適配器模式(轉)?

    【3】C++設計模式3-適配器模式Adapter | Veaxen's?

    總結

    以上是生活随笔為你收集整理的C++结构型模式-适配器模式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。