設(shè)計(jì)模式之:適配器模式 Adapter 2020-12-29

適配器模式是將一個(gè)舊類的接口窖认,通過抽象而后組合的方式畦贸,獲得一個(gè)新的接口以拓展新的功能。

動(dòng)機(jī)

在一切應(yīng)用中樟凄,因?yàn)樵瓉淼慕涌谝呀?jīng)不能滿足當(dāng)前新的需求聘芜。新功能和原有類相差較大,無法統(tǒng)一抽象缝龄,所以需要用新的方式將新功能擴(kuò)展出來汰现。

方法

和電源轉(zhuǎn)接插座一樣,在原有接口和新功能接口之間再分裝一個(gè)接口叔壤。實(shí)現(xiàn)來接口和新接口之家的適配瞎饲。
具體來說,新建一個(gè)包含原有類的抽象類炼绘,在該抽象類的內(nèi)部多定義一個(gè)新的適配接口用來實(shí)現(xiàn)新的功能嗅战。

這里使用中式插頭(CCnOutlet),為原有接口俺亮,現(xiàn)要拓展英式插頭(CEnOutlet)驮捍,所以這里就多定義了一個(gè)新適配器(Adapter), 一面繼承了原有中式插頭脚曾,又添加了擴(kuò)展槽(IAdaptee)支持了英式插頭东且。
例子代碼如下:

#include <iostream>
using namespace std;

class CCnOutlet //原有功能實(shí)現(xiàn)
{
public:
    virtual void useCnplug()
    {
        cout<<"use Cn plug."<<endl;
    }
};
class IAdaptee
{
public:
    void virtual useplug() = 0;
};
class CEnOutlet : public IAdaptee //新添加的功能實(shí)現(xiàn)
{
public:
    void useplug()
    {
        cout<<"use En plug."<<endl;
    }
};

class Adapter : public CCnOutlet//公有繼承目標(biāo), 適配原有接口
{
private:
    IAdaptee *pA;//適配對(duì)象本讥, 新添加插槽珊泳,支持新功能實(shí)現(xiàn)
public:
    Adapter(IAdaptee *p)
    {
        pA = p;
    }
    void useCnplug()
    {
        pA->useplug();
    }
};
int main()
{
    CEnOutlet *pEn = new CEnOutlet;//英式插座
    CCnOutlet *pCn = new Adapter(pEn);  //接口對(duì)接
    pCn->useCnplug();
    delete pEn;
    delete pCn;
    return 0;
}

一般的鲁冯, 適配器模式是將一個(gè)類的接口,通過抽象后組合的方式色查,獲得一個(gè)新的晓褪。它的類圖顯示如下:


適配器模式(Adapter)結(jié)構(gòu)圖.png

應(yīng)用場(chǎng)景

  • 使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
  • 已有代碼需要再次擴(kuò)展的情況下综慎,如:遺留代碼復(fù)用、類庫遷移的情形

代碼示例

#include <iostream>
using namespace std;

class Target {  // Target勤庐,客戶期望的接口示惊,可以使具體或抽象的類,也可以是接口
public:
    virtual void Request() = 0;
    virtual ~Target(){};
};

class Adaptee { // 需適配的類
public:
    void SpecificRequest() { cout << "Adaptee" << endl; }
};

class Adapter : public Target { // 通過內(nèi)部包裝一個(gè)Adaptee對(duì)象愉镰,把源接口轉(zhuǎn)換為目標(biāo)接口:
private:
    Adaptee* adaptee;
public:
    Adapter() { adaptee = new Adaptee(); }
    void Request() { adaptee->SpecificRequest(); }  // 調(diào)用Request()方法會(huì)轉(zhuǎn)換成調(diào)用adaptee.SpecificRequest()
    ~Adapter() { delete adaptee; }
};

int main() {
    Target* target = new Adapter();
    target->Request();

    delete target;
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末米罚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丈探,更是在濱河造成了極大的恐慌录择,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碗降,死亡現(xiàn)場(chǎng)離奇詭異隘竭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)讼渊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門动看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爪幻,你說我怎么就攤上這事菱皆。” “怎么了挨稿?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵仇轻,是天一觀的道長。 經(jīng)常有香客問我奶甘,道長篷店,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任甩十,我火速辦了婚禮船庇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侣监。我一直安慰自己鸭轮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布橄霉。 她就那樣靜靜地躺著窃爷,像睡著了一般邑蒋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上按厘,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天医吊,我揣著相機(jī)與錄音,去河邊找鬼逮京。 笑死卿堂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懒棉。 我是一名探鬼主播草描,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼策严!你這毒婦竟也來了穗慕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤妻导,失蹤者是張志新(化名)和其女友劉穎逛绵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倔韭,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡术浪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寿酌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添吗。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖份名,靈堂內(nèi)的尸體忽然破棺而出碟联,到底是詐尸還是另有隱情,我是刑警寧澤僵腺,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布鲤孵,位于F島的核電站,受9級(jí)特大地震影響辰如,放射性物質(zhì)發(fā)生泄漏普监。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一琉兜、第九天 我趴在偏房一處隱蔽的房頂上張望凯正。 院中可真熱鬧,春花似錦豌蟋、人聲如沸廊散。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允睹。三九已至运准,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缭受,已是汗流浹背胁澳。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留米者,地道東北人韭畸。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蔓搞,于是被迫代替她去往敵國和親陆盘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容