這篇文章主要介紹了簡單了解設計模式中的裝飾者模式及C++版代碼實現,ConcreteComponent的引用(指針)也可以達到修飾的功能,需要的朋友可以參考下
由遇到的問題引出的裝飾模式
在 OO 設計和開發過程,可能會經常遇到以下的情況:我們需要為一個已經定義好的類添加新的職責(操作),通常的情況我們會給定義一個新類繼承自定義好的類,這樣會帶來一個問題(將在本模式的討論中給出)。通過繼承的方式解決這樣的情況還帶來了系統的復雜性,因為繼承的深度會變得很深。
而裝飾提供了一種給類增加職責的方法,不是通過繼承實現的,而是通過組合。
有關這些內容在討論中進一步闡述。
模式選擇
裝飾模式典型的結構圖為:
在 結 構 圖 中 , ConcreteComponent 和裝飾需 要 有 同 樣 的 接 口 , 因 此ConcreteComponent 和裝飾有著一個共同的父類。這里有人會問,讓裝飾直接維護一個指向 ConcreteComponent 引用(指針)不就可以達到同樣的效果,答案是肯定并且是否定的??隙ǖ氖悄憧梢酝ㄟ^這種方式實現,否定的是你不要用這種方式實現,因為通過這種方式你就只能為這個特定的 ConcreteComponent 提供修飾操作了,當有了一個新的ConcreteComponent 你 又 要 去 新 建 一 個裝飾來 實 現 。 但 是 通 過 結 構 圖 中 的ConcreteComponent 和裝飾有一個公共基類,就可以利用 OO 中多態的思想來實現只要是 Component 型別的對象都可以提供修飾操作的類,這種情況下你就算新建了 100 個Component 型別的類 ConcreteComponent,也都可以由裝飾一個類搞定。這也正是裝飾模式的關鍵和威力所在了。
當然如果你只用給 Component 型別類添加一種修飾,則裝飾這個基類就不是很必要了。
實例
- #include
- using namespace std;
- class TestA
- {
- public:
- void display_a()
- {
- cout<<"display a..."<
- }
- };
- class TestB
- {
- public:
- void display_b()
- {
- cout<<"display b..."<
- }
- };
- 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;
- }
新聞熱點
疑難解答