一,定義
英文名字:decorator pattern,又稱裝飾者模式。
裝飾模式是在不必改變原類檔案和使用繼承的情況下,動態的擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。
二,總結
裝飾模式什麼時候實用?
當系統需要新功能的時候,向舊的類中新增新的**,而新的**裝飾了原有類的核心職責或主要行為。
如果在主類中新增新的字段,新的方法和新的邏輯,從而增加了主類的複雜度。而這些新新增的類僅僅是滿足特定情況的特殊需要。
解決方案:裝飾模式,把每個要裝飾的功能放在單獨的類中,並讓這個類包裝它要裝飾的物件,因此要執行特殊行為時,客戶端可以在執行時候有順序,有選擇的裝飾包裝物件。
三,例子
取自大話設計模式,小菜穿衣服。根據所穿不同衣服,穿衣服的順序分析乙個人風格?**內穿是普通人,**外穿是超人。
1)小菜扮靚第一版
下面程式,通過控制台可以完成扮靚的基本衣服型別。
缺點:如果要增加 「超人」 的裝扮(**外穿),怎麼辦?
更改person 類就違背了 開放 - 封閉原則,如何優化呢?把服飾寫成子類,方便擴充套件衣物子類。
#include using namespace std;
class person
~person(){}
void weartshirts()
2)小菜扮靚第二版
改進:增加了finery 服飾抽象類,和各種具體服飾子類,方便了擴充套件各種服飾子類,而不必更改person類,符合開放--封閉原則。
缺點:要顯示穿的什麼,還得在客戶端dtx.show() //顯示t恤 , kk.show() //顯示垮褲。相當於光著身子在大庭廣眾之下穿衣服,如何改進?
要內部組裝完畢,然後顯示出穿的什麼來。這個貌似建造者模式(但是建造者模式要求建造過程是穩定的,這裡可以內穿西裝外套t恤)
#include using namespace std;
class person
; void show(void)
3)小菜扮靚第三版
結構:person類需要穿衣服,讓抽象裝飾類繼承person類。然後繼承抽象服飾類,初始化服飾子類。
改進:相對於第二版,可以先將衣服穿好
(裝飾過程)
sneakers* pqx = new sneakers();bigtrouser* kk = new bigtrouser();
tshirts* dtx = new tshirts();
pqx->decorator(xiaocai);
kk->decorator(pqx);
dtx->decorator(kk);
然後再顯示出來 dtx.show()
#include #include class person
; virtual void show(void)
; person(){};
private:
std::string m_name;
};//服飾類
class finery :public person
; void show(void)
};protected:
person* m_pcomponent;
};//具體服飾類
class tshirts :public finery
};class bigtrouser :public finery;};
class sneakers :public finery;};
class suit :public finery;};
class tie :public finery;};
class leathershoe :public finery;};
int main()
Java設計模式 裝飾者模
裝飾者模式,其實不難理解,簡單地說就是裝飾者和被裝飾者擁有共同的超類,裝飾者只是豐富了行為,拓展了功能,而型別是不變的。說起來可能比較抽象,接下來通過乙個簡單的例子來實現乙個裝飾者模式。動態的給乙個物件新增一些額外的職責或者功能,就增加功能來說,裝飾者模式相比生成子類更為靈活。大多數情況下被裝飾者不...
設計模式原來這麼簡單 裝飾器模式
1.什麼是裝飾器模式wiki 允許將行為靜態或動態地新增到單個物件中,而不會影響同一類中其他物件的行為。2.例項 以前用的qq秀,需要為角色穿不同的衣服 頭飾 臉飾 上衣 褲子。不同的衣服展示不同的形象,而且還可以 根據形象的炫酷值和好友pk。3.程式示例 qq秀角色 public inte ce ...
JAVA設計模式(九)設計模式之裝飾器設計模式
本章講解設計模式中裝飾器設計模式的相關知識 1.概念 與橋接模式類似,該模式也是為了解決類 的問題。但是裝飾器模式關注於功能的擴充套件,真實的角色比較穩定。橋接模式的真實角色在多維度之間不斷的變化,具有不確定性。2.裝飾器模式的實現思路 1 新建相應工程 其中,car 車 為基本物件,feature...