C++設(shè)計(jì)模式之適配器模式(Adapter)
適配器模式顧名思義在于接口的轉(zhuǎn)換,最形象的例子就如兩口轉(zhuǎn)三口電源適配器,口子的數(shù)量可以理解為參數(shù)數(shù)量,一如我們調(diào)用三個(gè)參數(shù)的接口,而提供的接口只有兩個(gè)參數(shù),那么久需要適配器類進(jìn)行接口的擴(kuò)展改造,這就是適配器模式存在的最主要意義。
作用
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類可以一起工作,使控制范圍之外的一個(gè)原有對(duì)象與某個(gè)接口匹配。適配器模式主要應(yīng)用于希望復(fù)用一些現(xiàn)存的類,但是接口又與復(fù)用環(huán)境要求不一致的情況。
想使用一個(gè)已經(jīng)存在的類,但如果它的接口,也就是它的方法和你的要求不相同時(shí),就應(yīng)該考慮用適配器模式。
類視圖
類模式適配器

對(duì)象模式適配器

代碼實(shí)現(xiàn)
//目標(biāo)接口類,客戶需要的接口
class Target
{
public:
Target(){}
virtual ~Target(){}
virtual void Request()//定義新的標(biāo)準(zhǔn)接口
{
cout << "Request" << endl;
}
};
//需要適配的類
class Object
{
public:
Object(){}
~Object(){}
void SpecificRequest()
{
cout << "SpecificRequest" << endl;
}
};
//類模式,適配器類,通過(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ì)象模式,適配器類,繼承Target類,采用組合的方式實(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()
{
//類模式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ò)繼承,子類獲得了父類的接口,而實(shí)現(xiàn)繼承指的是通過(guò)繼承子類獲得了父類的實(shí)現(xiàn)(并不統(tǒng)共接口)。在C++中的public繼承既是接口繼承又是實(shí)現(xiàn)繼承,因?yàn)樽宇愒诶^承了父類后既可以對(duì)外提供父類中的接口操作,又可以獲得父類的接口實(shí)現(xiàn)。當(dāng)然我們可以通過(guò)一定的方式和技術(shù)模擬單獨(dú)的接口繼承和實(shí)現(xiàn)繼承,例如我們可以通過(guò)private繼承獲得實(shí)現(xiàn)繼承的效果(private繼承后,父類中的接口都變?yōu)閜rivate,當(dāng)然只能是實(shí)現(xiàn)繼承了。),通過(guò)純抽象基類模擬接口繼承的效果,但是在C++中pure virtual function也可以提供默認(rèn)實(shí)現(xiàn),因此這是不純正的接口繼承,但是在Java中我們可以interface來(lái)獲得真正的接口繼承了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談C++函數(shù)聲明后面加throw()的作用(必看)
下面小編就為大家?guī)?lái)一篇淺談C++函數(shù)聲明后面加throw()的作用(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
C語(yǔ)言學(xué)習(xí)之函數(shù)知識(shí)總結(jié)
函數(shù)是一組一起執(zhí)行一個(gè)任務(wù)的語(yǔ)句。每個(gè)?C?程序都至少有一個(gè)函數(shù),即主函數(shù)?main()?,所有簡(jiǎn)單的程序都可以定義其他額外的函數(shù)。本文就為大家詳細(xì)講講C語(yǔ)言中函數(shù)的相關(guān)知識(shí)點(diǎn),希望有所幫助2022-07-07
基于C++執(zhí)行內(nèi)存memcpy效率測(cè)試的分析
本篇文章對(duì)C++中執(zhí)行內(nèi)存memcpy的效率進(jìn)行了分析測(cè)試。需要的朋友參考下2013-05-05
常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))
下面小編就為大家?guī)?lái)一篇常用Hash算法(C語(yǔ)言的簡(jiǎn)單實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
C++運(yùn)算符重載實(shí)例代碼詳解(調(diào)試環(huán)境 Visual Studio 2019)
這篇文章主要介紹了C++運(yùn)算符重載實(shí)例(調(diào)試環(huán)境 Visual Studio 2019),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
C++?使用getline()從文件中讀取一行字符串方法示例
這篇文章主要介紹了C++?使用getline()從文件中讀取一行字符串方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
C++靜態(tài)變量,常量的存儲(chǔ)位置你真的了解嗎
這篇文章主要介紹了C++中靜態(tài)變量與常量的存儲(chǔ)位置的相關(guān)資料,需要的朋友可以參考下,希望能夠給你帶來(lái)幫助2021-08-08

