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++结构型模式-适配器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux sar 分析,Linux性能
- 下一篇: s3c2440移植MQTT