簡(jiǎn)單了解設(shè)計(jì)模式中的裝飾者模式及C++版代碼實(shí)現(xiàn)
由遇到的問(wèn)題引出的裝飾模式
在 OO 設(shè)計(jì)和開(kāi)發(fā)過(guò)程,可能會(huì)經(jīng)常遇到以下的情況:我們需要為一個(gè)已經(jīng)定義好的類(lèi)添加新的職責(zé)(操作),通常的情況我們會(huì)給定義一個(gè)新類(lèi)繼承自定義好的類(lèi),這樣會(huì)帶來(lái)一個(gè)問(wèn)題(將在本模式的討論中給出)。通過(guò)繼承的方式解決這樣的情況還帶來(lái)了系統(tǒng)的復(fù)雜性,因?yàn)槔^承的深度會(huì)變得很深。
而裝飾提供了一種給類(lèi)增加職責(zé)的方法,不是通過(guò)繼承實(shí)現(xiàn)的,而是通過(guò)組合。
有關(guān)這些內(nèi)容在討論中進(jìn)一步闡述。
模式選擇
裝飾模式典型的結(jié)構(gòu)圖為:

在 結(jié) 構(gòu) 圖 中 , ConcreteComponent 和裝飾需 要 有 同 樣 的 接 口 , 因 此ConcreteComponent 和裝飾有著一個(gè)共同的父類(lèi)。這里有人會(huì)問(wèn),讓裝飾直接維護(hù)一個(gè)指向 ConcreteComponent 引用(指針)不就可以達(dá)到同樣的效果,答案是肯定并且是否定的??隙ǖ氖悄憧梢酝ㄟ^(guò)這種方式實(shí)現(xiàn),否定的是你不要用這種方式實(shí)現(xiàn),因?yàn)橥ㄟ^(guò)這種方式你就只能為這個(gè)特定的 ConcreteComponent 提供修飾操作了,當(dāng)有了一個(gè)新的ConcreteComponent 你 又 要 去 新 建 一 個(gè)裝飾來(lái) 實(shí) 現(xiàn) 。 但 是 通 過(guò) 結(jié) 構(gòu) 圖 中 的ConcreteComponent 和裝飾有一個(gè)公共基類(lèi),就可以利用 OO 中多態(tài)的思想來(lái)實(shí)現(xiàn)只要是 Component 型別的對(duì)象都可以提供修飾操作的類(lèi),這種情況下你就算新建了 100 個(gè)Component 型別的類(lèi) ConcreteComponent,也都可以由裝飾一個(gè)類(lèi)搞定。這也正是裝飾模式的關(guān)鍵和威力所在了。
當(dāng)然如果你只用給 Component 型別類(lèi)添加一種修飾,則裝飾這個(gè)基類(lèi)就不是很必要了。
實(shí)例
#include <iostream>
using namespace std;
class TestA
{
public:
void display_a()
{
cout<<"display a..."<<endl;
}
};
class TestB
{
public:
void display_b()
{
cout<<"display b..."<<endl;
}
};
class Facade
{
TestA *testa;
TestB *testb;
public:
Facade()
{
testa = new TestA();
testb = new TestB();
}
~Facade()
{
delete testa;
delete testb;
}
void MethodA()
{
testa->display_a();
testb->display_b();
}
};
int main()
{
Facade *facade = new Facade();
facade->MethodA();
system("pause");
return 0;
}
- 深入解析設(shè)計(jì)模式中的適配器模式在C++中的運(yùn)用
- 詳解state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例
- 詳解C++設(shè)計(jì)模式編程中對(duì)狀態(tài)模式的運(yùn)用
- C++設(shè)計(jì)模式編程中Facade外觀模式的使用實(shí)例解析
- 通過(guò)C++程序示例理解設(shè)計(jì)模式中的外觀模式
- C++設(shè)計(jì)模式編程中Template Method模板方法模式的運(yùn)用
- 詳解設(shè)計(jì)模式中的模板方法模式及在C++中的使用
- 深入解析C++編程中對(duì)設(shè)計(jì)模式中的策略模式的運(yùn)用
- 詳解C++設(shè)計(jì)模式編程中策略模式的優(yōu)缺點(diǎn)及實(shí)現(xiàn)
- 設(shè)計(jì)模式中的備忘錄模式解析及相關(guān)C++實(shí)例應(yīng)用
相關(guān)文章
使用C++的inipp庫(kù)處理配置文件.ini的示例詳解
一個(gè)ini文件由多個(gè)節(jié)section組成,每個(gè)節(jié)由多個(gè)鍵值對(duì)組成,本文給大家介紹了使用第三方庫(kù)inipp來(lái)操作ini文件,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-01-01
c++ map索引不存在的key可能導(dǎo)致的后果分析
這篇文章主要介紹了c++ map索引不存在的key可能導(dǎo)致的后果分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解
下面小編就為大家?guī)?lái)一篇C語(yǔ)言變長(zhǎng)數(shù)組 struct中char data[0]的用法詳解。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
C語(yǔ)言通過(guò)三種方法實(shí)現(xiàn)屬于你的通訊錄
本文將實(shí)現(xiàn)一個(gè)通訊錄,來(lái)實(shí)現(xiàn)人員的增刪插改功能。文中通過(guò)三種形式來(lái)實(shí)現(xiàn)用戶(hù)的增刪插改,其實(shí)也就是一點(diǎn)點(diǎn)的優(yōu)化版本,從靜態(tài)的實(shí)現(xiàn),到動(dòng)態(tài)的實(shí)現(xiàn),最后以文件的形式來(lái)完成,請(qǐng)大家和我一起往下看吧2022-11-11
詳解如何利用C++實(shí)現(xiàn)一個(gè)反射類(lèi)
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)反射類(lèi),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
詳解C++編程中的主表達(dá)式與后綴表達(dá)式編寫(xiě)基礎(chǔ)
這篇文章主要介紹了C++編程中的主表達(dá)式與后綴表達(dá)式編寫(xiě)基礎(chǔ),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01

