10 结构型模式-----装饰模式
模式動機(Decorator Pattern):我們在給一個類進行功能擴展時,總是通過繼承或者復(fù)合關(guān)系,使得一個類具有其他相關(guān)類型的功能,繼承本身屬于靜態(tài)關(guān)聯(lián),派生類比較臃腫,使用者也不能控制增加功能的方式。而使用復(fù)合機制,即將一個類的對象作為另一個類的成員,我們可以決定什么時候調(diào)用哪種功能,非常方便,這就是裝飾模式,即給一個現(xiàn)有的類進行裝飾,使其具有我們希望的功能。
模式結(jié)構(gòu)圖:
?
?
模式代碼:
bt_裝飾模式.h:
?
1 #ifndef DP_H 2 #define DP_H 3 #include <iostream> 4 using namespace std; 5 6 /* 7 抽象組件類 8 */ 9 class Component 10 { 11 public: 12 virtual ~Component(){ } 13 virtual void Operation(){ } 14 }; 15 16 /* 17 具體組件類 18 */ 19 class ConcreteComponent : public Component 20 { 21 public: 22 virtual void Operation() 23 { 24 cout << "具體組件類的功能" << endl; 25 } 26 }; 27 28 /* 29 抽象裝飾器類:維護一個指向抽象組件類的指針, 30 并定義一個與抽象組件類一致的接口 31 */ 32 class Decorator : public Component 33 { 34 public: 35 Decorator(Component* pCom) : component(pCom){ } 36 virtual void Operation() 37 { 38 component->Operation(); // 調(diào)用抽象組件類的功能 39 } 40 41 private: 42 Component* component; 43 }; 44 45 /* 46 具體裝飾器:負責對組件進行裝飾以添加新功能 47 */ 48 class ConcreteDecoratorA : public Decorator 49 { 50 public: 51 ConcreteDecoratorA(Component* pCom, int state = 0) : Decorator(pCom), addedState(state){ } 52 virtual void Operation() 53 { 54 Decorator::Operation(); 55 cout << "裝飾器A為組件新增狀態(tài) = " << addedState << endl; 56 } 57 58 private: 59 int addedState; 60 }; 61 62 class ConcreteDecoratorB : public Decorator 63 { 64 public: 65 ConcreteDecoratorB(Component* pCom) : Decorator(pCom){ } 66 virtual void Operation() 67 { 68 Decorator::Operation(); 69 AddedBehavior(); 70 } 71 72 private: 73 void AddedBehavior() // 具體裝飾器新增的功能 74 { 75 cout << "裝飾器B為組件新增功能" << endl; 76 } 77 }; 78 79 #endif // DP_H?
?
測試用例.cpp:
1 #include "bt_裝飾模式.h" 2 3 int main() 4 { 5 cout << "***** 裝飾模式測試 *****" << endl; 6 Component* pCom = new ConcreteComponent; 7 pCom->Operation(); // 未裝飾時 8 cout << endl; 9 10 cout << "裝飾器A" << endl; 11 Decorator* pDec1 = new ConcreteDecoratorA(pCom); 12 pDec1->Operation(); // 第一次裝飾后 13 cout << endl; 14 15 cout << "裝飾器B" << endl; 16 Decorator* pDec2 = new ConcreteDecoratorB(pDec1); 17 pDec2->Operation(); // 第二次裝飾后 18 19 delete pDec2; 20 delete pDec1; 21 delete pCom; 22 23 return 0; 24 }?
模式優(yōu)缺點:
1》 相比于靜態(tài)繼承擴展,裝飾器模式可以提供更多的靈活性,它允許客戶在運行時添加裝飾功能,而繼承則是在靜態(tài)編譯時就確定了,再者,多重繼承時雖然很多功能派生類用不到,但是仍然不得不處理。相比而言,裝飾器可以通過多個不同的裝飾類來裝飾組件從而添加不同的新功能,擴展非常方便。
2》 組件層次和裝飾層次耦合性比較低,可以獨立發(fā)展,通過搭配不同的具體組件和具體裝飾器可以實現(xiàn)不同的組合,新增時不需要改變源代碼,符合“開閉原則”。
3》 裝飾模式比較麻煩,使用時可能需要創(chuàng)建多個裝飾類對象,使得系統(tǒng)設(shè)計復(fù)雜度增大;若多次級聯(lián)調(diào)用裝飾器,一旦出錯必須逐級排查。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/benxintuzi/p/4548742.html
總結(jié)
以上是生活随笔為你收集整理的10 结构型模式-----装饰模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell实现矩阵转置
- 下一篇: MongoDB学习笔记~MongoDB实