C++结构型模式-适配器模式
1.1 基本概念
適配器模式(Adapter Pattern):或稱為包裝器(Wrapper)將一個(gè)接口轉(zhuǎn)換為客戶希望的另一個(gè)接口,適配器模式使接口不兼容的那些類可以一起工作,
適配器模式包括類適配器和對(duì)象適配器。
1.2 模式結(jié)構(gòu)
1、Target(目標(biāo)抽象類) :目標(biāo)抽象類定義客戶要用的特定領(lǐng)域的接口,可以是個(gè)抽象類或接口,也可以是個(gè)具體類;
2、Adapter(適配器類):可以調(diào)用另一個(gè)接口,作為一個(gè)轉(zhuǎn)換器,對(duì)適配者類和目標(biāo)抽象類進(jìn)行適配。
(1)類適配器中,適配器類通過(guò)實(shí)現(xiàn)Target接口并繼承 Adaptee類,使得兩者產(chǎn)生聯(lián)系;
(2)對(duì)象適配器類中,適配器類通過(guò)繼承Target,并關(guān)聯(lián)一個(gè)Adaptee對(duì)象使兩者產(chǎn)生聯(lián)系;
3、Adaptee (適配者類)
被適配的角色,它定義了一個(gè)已經(jīng)存在的接口,這個(gè)接口需要適配。
4、Client(客戶類)
針對(duì)目標(biāo)抽象類進(jìn)行編程,調(diào)用在抽象目標(biāo)類中定義的業(yè)務(wù)方法。
(1)類適配器模式結(jié)構(gòu):適配器類Adapter,實(shí)現(xiàn)了抽象目標(biāo)類(Target)接口,并繼承了適配者類(Adaptee),在適配器類 的request()方法中調(diào)用所繼承的適配者類(Adaptee)的SpeaificRequest()方法,實(shí)現(xiàn)了適配的目的。
(2)對(duì)象適配器模式結(jié)構(gòu)
?為了使客戶端能夠使用適配者類Adapte 的 spcificRequest()方法,需要提供一個(gè)適配器類Adapter,這個(gè)適配器類包裝了一個(gè)適配者的實(shí)例,從而將客戶端和適配者銜接起來(lái),在適配器的request()方法中調(diào)用適配者的?spcificRequest()方法。適配器類和適配者類為關(guān)聯(lián)關(guān)系。
1.3 優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
缺點(diǎn):
1.4 應(yīng)用場(chǎng)景
(1)系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需求;
(2)數(shù)據(jù)庫(kù)鏈接工具JDBC,使得使用Java語(yǔ)言程序能夠與數(shù)據(jù)庫(kù)鏈接,并使用SQL語(yǔ)言來(lái)查詢和操作數(shù)據(jù)庫(kù)。
1.5 實(shí)例
1.5.1 類適配器模式
設(shè)計(jì)一個(gè)可以模擬各種動(dòng)物的機(jī)器人,在機(jī)器人中定義了一系列方法,如機(jī)器人叫喊 cry()方法,機(jī)器人移動(dòng)方法 move,現(xiàn)在在不修改已有代碼的情況下,使得機(jī)器人能夠像狗一樣,叫 wang()和跑 move()
#include <iostream> using namespace std; /*目標(biāo)抽象類RobotTarget 機(jī)器人接口*/ 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() {//對(duì)象適配器RobotTarget* robot= new DogAdapter();robot->cry();robot->move();delete robot;return 0; }1.5.2 對(duì)象適配器模式
英式插座與中式插座規(guī)格不同,如何在不修改英式插座的基礎(chǔ)上轉(zhuǎn)換為中式插座。
#include <iostream> #include <string>using namespace std;//目標(biāo)抽象類 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; }參考文獻(xiàn):
【1】https://www.jianshu.com/p/b8d3142772e0
【2】C++設(shè)計(jì)模式-Adapter適配器模式(轉(zhuǎn))?
【3】C++設(shè)計(jì)模式3-適配器模式Adapter | Veaxen's?
總結(jié)
以上是生活随笔為你收集整理的C++结构型模式-适配器模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux sar 分析,Linux性能
- 下一篇: C++关键字分析系列