C++设计模式--适配器模式
生活随笔
收集整理的這篇文章主要介紹了
C++设计模式--适配器模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
定義
適配器(Adapter)又叫包裝器(Wrapper),是一種類對象結(jié)構(gòu)性模式,目的是將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
分類
適配器有兩種實現(xiàn)方式,分別是類適配器和對象適配器。這兩種實現(xiàn)方式不太一樣。
- 類適配器:通過多繼承的方式來實現(xiàn)
- 對象適配器:通過對象組合的方式來實現(xiàn)
類適配器
對象適配器
說明:
- Target:定義 Client 使用的與特定領(lǐng)域相關(guān)的接口
- Client:與符合 Target 接口的對象協(xié)同
- Adaptee:定義一個已經(jīng)存在的接口,這個接口需要適配
- Adapter:對 Adaptee 的接口與 Target 接口進(jìn)行適配
適用性
以下幾種情況可以使用 Adapter 模式
- 你想使用一個已經(jīng)存在的類,而它的接口不符合你的要求
- 你想要創(chuàng)建一個可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類(即那些接口可能不一定兼容的類)協(xié)同工作
- (僅適用于對象 Adapter)你想使用一些已經(jīng)存在的子類,但是不可能對每一個都進(jìn)行子類化以匹配它的接口。對象適配器可以適配它的父類接口。
兩種適配器的區(qū)別和特點
以上說了兩種適配器的原理,那么,在項目中該如何選擇哪種類型的適配器呢?接下來詳細(xì)看看這兩種適配器的特點。
類適配器
- 用一個具體的 Adapter 類對 Adaptee 和 Target 進(jìn)行匹配。結(jié)果是當(dāng)我們想要匹配一個類以及它的所有子類時,類 Adapter 將不能勝任工作。
- Adapter 可以重定義 Adaptee 的部分行為,因為Adapter 是 Adaptee 的子類
- 僅僅引入了一個對象,并不需要額外的指針以間接得到 adaptee 對象
對象適配器
- 允許一個 Adapter 與多個 Adaptee----即 Adaptee 本身以及它的所有子類同時工作。Adapter 可以一次給所有的 Adaptee 添加功能。
- 使得重定義 Adaptee 的行為會比較困難。這需要生成Adaptee 的子類并且使得 Adapter 引用這個子類而不是引用 Adaptee 本身。
OK,說了這么多,都是理論的東西,接下來結(jié)合示例來理解。
示例
大家都知道,小鳥只能在天上飛,但是不能在水里游,那如果我們想要它能在水里游怎么辦呢(我也是異想天開,哈哈哈),那就得給它賦予一點魔法,能夠擁有游泳的技能(感覺創(chuàng)造了一個新物種)。OK,來看一下代碼:
對象適配器
#include <iostream>using namespace std; //target //創(chuàng)建目標(biāo)接口 class Bird { public:virtual void swimming() = 0; };//adaptee //創(chuàng)建適配者,就是希望擁有的技能 class SwimmingSkills { public:void CanSwim(){cout << "I can finally swim." << endl;} };//創(chuàng)建適配器 class SwimAdapter : public Bird { public:SwimAdapter(){m_pSwimmingSkills = new SwimmingSkills;}~SwimAdapter(){if(m_pSwimmingSkills){delete m_pSwimmingSkills;m_pSwimmingSkills = nullptr;}}virtual void swimming(){m_pSwimmingSkills->CanSwim();}private:SwimmingSkills * m_pSwimmingSkills = nullptr; };int main() {SwimAdapter adapter;adapter.swimming();return 0; }可以看到,經(jīng)過適配,現(xiàn)在小鳥也可以在水里游泳啦,哈哈哈哈。
類適配器
類適配器的方式就直接多繼承來實現(xiàn)啦,修改以上示例:
class SwimAdapter1 : public Bird ,SwimmingSkills { public:virtual void swimming(){CanSwim();} };其他的代碼保持不變。這種方式看起來好像代碼更簡單,但是真正在項目中時,要盡量避免使用多繼承的方式,可能會導(dǎo)致混淆(關(guān)于這部分,后期再單獨介紹)。大家可以根據(jù)上述的兩種適配器的優(yōu)缺點來進(jìn)行選擇。
總結(jié)
以上是生活随笔為你收集整理的C++设计模式--适配器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++之dynamic_cast、sta
- 下一篇: 快速了解 UML 类图