深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用
適配器模式屬于結(jié)構(gòu)型的設(shè)計(jì)模式,它是結(jié)構(gòu)型設(shè)計(jì)模式之首(用的最多的結(jié)構(gòu)型設(shè)計(jì)模式)。
適配器設(shè)計(jì)模式也并不復(fù)雜,適配器它是主要作用是將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口這樣使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。適配器模式有兩種:1.類的適配器 2.對(duì)象適配器,對(duì)象適配器更多一些。
示例:比如你在網(wǎng)上買了一個(gè)手機(jī),但是買家給你發(fā)回來了一個(gè)3接頭的充電器,但是恰好你又沒有3接頭的插槽,只有2個(gè)接口的插槽,于是你很直然地便會(huì)想到去找你個(gè)3接口轉(zhuǎn)兩接口的轉(zhuǎn)換器。簡(jiǎn)單的分析下這個(gè)轉(zhuǎn)換器便是我們這里的適配器Adapter。三相插頭便是我們要適配的Adaptee,兩相插類適配器-----在我看來C++的類適配器的用多重繼承實(shí)現(xiàn),并提供適配后的接口。
這是你的三相插頭
class ThreePhaseOutlet { public: void doThreePhasePlugin() { cout<<"三相插頭強(qiáng)勢(shì)插入!"<<endl; } };
這是你想要的兩相插頭
class TwoPhaseOutlet { public: virtual void doPlugin() = 0; };
然后你將需要找到一個(gè)轉(zhuǎn)接頭,將三相插頭轉(zhuǎn)換為“兩相插頭”
class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet { public: void doPlugin() { doConvertor(); doThreePhasePlugin(); } void doConvertor() { cout<<"三相插頭轉(zhuǎn)為兩廂插頭!"<<endl; } };
現(xiàn)在你可以強(qiáng)勢(shì)插入兩相的插口了。
TwoPhaseOutlet* outlet = new OutletConvertor(); outlet->doPlugin();
對(duì)象適配器模式-----對(duì)象適配器是將需要適配的對(duì)象進(jìn)行包裝然后提供適配后的接口。
對(duì)象適配器的 三相插口和轉(zhuǎn)接頭的代碼和上面一致。只是整合步驟不一致
class OutletConvertor : public TwoPhaseOutlet { public: void doPlugin() { doConvertor(); m_out.doThreePhasePlugin(); } void doConvertor() { cout<<"三相插頭轉(zhuǎn)為兩廂插頭!"<<endl; } ThreePhaseOutlet m_out; };
對(duì)象適配器相比類適配器來說更加靈活,他可以選擇性適配自己想適配的對(duì)象。例如我們下面把代碼改成這樣,你也許就會(huì)明白為什么我這樣說:
class OutletConvertor : public TwoPhaseOutlet { public: OutletConvertor(ThreePhaseOutlet out) { m_out = out; } void doPlugin() { doConvertor(); m_out.doThreePhasePlugin(); } void doConvertor() { cout<<"三相插頭轉(zhuǎn)為兩廂插頭!"<<endl; } ThreePhaseOutlet m_out; };
我們?cè)跇?gòu)造的時(shí)候?qū)⒕唧w需要適配的適配對(duì)象傳入,這樣便可以根據(jù)傳入不同的對(duì)象,從而對(duì)該對(duì)象進(jìn)行適配。而類適配器卻無法選擇對(duì)象,他是對(duì)整個(gè)類進(jìn)行適配。也就是把所有的三相插口全部轉(zhuǎn)換為兩相的,而不是針對(duì)某一個(gè)。
在以下各種情況下使用適配器模式:
1、 系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。
2、 想要建立一個(gè)可以重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作。這些源類不一定有很復(fù)雜的接口。
3、 (對(duì)對(duì)象適配器而言)在設(shè)計(jì)里,需要改變多個(gè)已有子類的接口,如果使用類的適配器模式,就要針對(duì)每一個(gè)子類做一個(gè)適配器,而這不太實(shí)際。
Adapter模式在實(shí)現(xiàn)時(shí)有以下這些值得注意的地方:
1、 目標(biāo)接口可以省略,模式發(fā)生退化。但這種做法看似平庸而并不平庸,它可以使Adaptee不必實(shí)現(xiàn)不需要的方法(可以參考Default Adapter模式)。其表現(xiàn)形式就是父類實(shí)現(xiàn)缺省方法,而子類只需實(shí)現(xiàn)自己獨(dú)特的方法。這有些像模板(Template)模式。
2、 適配器類可以是抽象類。
3、 帶參數(shù)的適配器模式。使用這種辦法,適配器類可以根據(jù)參數(shù)返還一個(gè)合適的實(shí)例給客戶端。
上一篇:C++初學(xué)者之根據(jù)輸入的任何一個(gè)正整數(shù),輸出可能被表示的連續(xù)正整數(shù)
欄 目:C語言
下一篇:C++設(shè)計(jì)模式編程中的觀察者模式使用示例
本文標(biāo)題:深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2474.html
您可能感興趣的文章
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解
- 01-10深入解析最長(zhǎng)公共子串
- 01-10深入理解鏈表的各類操作詳解
- 01-10深入N皇后問題的兩個(gè)最高效算法的詳解
- 01-10深入理解二叉樹的非遞歸遍歷


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery