簡單了解設計模式中的裝飾者模式及C++版代碼實現
由遇到的問題引出的裝飾模式
在 OO 設計和開發(fā)過程,可能會經常遇到以下的情況:我們需要為一個已經定義好的類添加新的職責(操作),通常的情況我們會給定義一個新類繼承自定義好的類,這樣會帶來一個問題(將在本模式的討論中給出)。通過繼承的方式解決這樣的情況還帶來了系統(tǒng)的復雜性,因為繼承的深度會變得很深。
而裝飾提供了一種給類增加職責的方法,不是通過繼承實現的,而是通過組合。
有關這些內容在討論中進一步闡述。
模式選擇
裝飾模式典型的結構圖為:
在 結 構 圖 中 , ConcreteComponent 和裝飾需 要 有 同 樣 的 接 口 , 因 此ConcreteComponent 和裝飾有著一個共同的父類。這里有人會問,讓裝飾直接維護一個指向 ConcreteComponent 引用(指針)不就可以達到同樣的效果,答案是肯定并且是否定的??隙ǖ氖悄憧梢酝ㄟ^這種方式實現,否定的是你不要用這種方式實現,因為通過這種方式你就只能為這個特定的 ConcreteComponent 提供修飾操作了,當有了一個新的ConcreteComponent 你 又 要 去 新 建 一 個裝飾來 實 現 。 但 是 通 過 結 構 圖 中 的ConcreteComponent 和裝飾有一個公共基類,就可以利用 OO 中多態(tài)的思想來實現只要是 Component 型別的對象都可以提供修飾操作的類,這種情況下你就算新建了 100 個Component 型別的類 ConcreteComponent,也都可以由裝飾一個類搞定。這也正是裝飾模式的關鍵和威力所在了。
當然如果你只用給 Component 型別類添加一種修飾,則裝飾這個基類就不是很必要了。
實例
#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; }
相關文章
Qt顯示QImage圖像在label上,并保持自適應大小問題
這篇文章主要介紹了Qt顯示QImage圖像在label上,并保持自適應大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11