C++設(shè)計(jì)模式之適配器模式(Adapter)
適配器模式顧名思義在于接口的轉(zhuǎn)換,最形象的例子就如兩口轉(zhuǎn)三口電源適配器,口子的數(shù)量可以理解為參數(shù)數(shù)量,一如我們調(diào)用三個(gè)參數(shù)的接口,而提供的接口只有兩個(gè)參數(shù),那么久需要適配器類(lèi)進(jìn)行接口的擴(kuò)展改造,這就是適配器模式存在的最主要意義。
作用
將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作,使控制范圍之外的一個(gè)原有對(duì)象與某個(gè)接口匹配。適配器模式主要應(yīng)用于希望復(fù)用一些現(xiàn)存的類(lèi),但是接口又與復(fù)用環(huán)境要求不一致的情況。
想使用一個(gè)已經(jīng)存在的類(lèi),但如果它的接口,也就是它的方法和你的要求不相同時(shí),就應(yīng)該考慮用適配器模式。
類(lèi)視圖
類(lèi)模式適配器
對(duì)象模式適配器
代碼實(shí)現(xiàn)
//目標(biāo)接口類(lèi),客戶(hù)需要的接口 class Target { public: Target(){} virtual ~Target(){} virtual void Request()//定義新的標(biāo)準(zhǔn)接口 { cout << "Request" << endl; } }; //需要適配的類(lèi) class Object { public: Object(){} ~Object(){} void SpecificRequest() { cout << "SpecificRequest" << endl; } }; //類(lèi)模式,適配器類(lèi),通過(guò)public繼承獲得接口繼承的效果,通過(guò)private繼承獲得實(shí)現(xiàn)繼承的效果 class Adapter :public Target, private Object { public: Adapter(){} ~Adapter(){} virtual void Request()//實(shí)現(xiàn)Target定義的Request接口 { cout << "AdapterRequest" << endl; this->SpecificRequest(); cout << "----------------------------" << endl; } }; //對(duì)象模式,適配器類(lèi),繼承Target類(lèi),采用組合的方式實(shí)現(xiàn)Object的復(fù)用 class Adapter1 :public Target { public: Adapter1(Object* adaptee) :_adaptee(adaptee) {} Adapter1() :_adaptee(new Object) {} ~Adapter1(){} virtual void Request()//實(shí)現(xiàn)Target定義的Request接口 { cout << "Adapter1Request" << endl; _adaptee->SpecificRequest(); cout << "----------------------------" << endl; } private: Object* _adaptee; }; //client調(diào)用 int main() { //類(lèi)模式Adapter Target* pTarget = new Adapter(); pTarget->Request(); //對(duì)象模式Adapter1 Adaptee* ade = new Adaptee(); Target* pTarget1= new Adapter1(ade); pTarget1->Request(); //對(duì)象模式Adapter2 Target* pTarget2 = new Adapter1(); pTarget2->Request(); return 0; }
在Adapter模式的兩種模式中,有一個(gè)很重要的概念就是接口繼承和實(shí)現(xiàn)繼承的區(qū)別和聯(lián)系。接口繼承和實(shí)現(xiàn)繼承是面向?qū)ο箢I(lǐng)域的兩個(gè)重要的概念,接口繼承指的是通過(guò)繼承,子類(lèi)獲得了父類(lèi)的接口,而實(shí)現(xiàn)繼承指的是通過(guò)繼承子類(lèi)獲得了父類(lèi)的實(shí)現(xiàn)(并不統(tǒng)共接口)。在C++中的public繼承既是接口繼承又是實(shí)現(xiàn)繼承,因?yàn)樽宇?lèi)在繼承了父類(lèi)后既可以對(duì)外提供父類(lèi)中的接口操作,又可以獲得父類(lèi)的接口實(shí)現(xiàn)。當(dāng)然我們可以通過(guò)一定的方式和技術(shù)模擬單獨(dú)的接口繼承和實(shí)現(xiàn)繼承,例如我們可以通過(guò)private繼承獲得實(shí)現(xiàn)繼承的效果(private繼承后,父類(lèi)中的接口都變?yōu)閜rivate,當(dāng)然只能是實(shí)現(xiàn)繼承了。),通過(guò)純抽象基類(lèi)模擬接口繼承的效果,但是在C++中pure virtual function也可以提供默認(rèn)實(shí)現(xiàn),因此這是不純正的接口繼承,但是在Java中我們可以interface來(lái)獲得真正的接口繼承了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java C++題解leetcode915分割數(shù)組示例
這篇文章主要為大家介紹了Java C++題解leetcode915分割數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11探討:C++中函數(shù)返回引用的注意事項(xiàng)
本篇文章是對(duì)C++中函數(shù)返回引用的注意事項(xiàng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C語(yǔ)言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法
這篇文章主要介紹了C語(yǔ)言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09