设计模式(6)-装饰器(认识程序中的装饰器)
之前已經看過裝飾器模式,但是感覺不是很清晰,但是有一種情況下出的代碼,一定是裝飾器。
Widget* aWidget = new BorderDecorator(new BorderDecorator(new ScrollDecorator(new TextField( 80, 24 ))));可以看到,層層嵌套,每個類都可以按照一定的順序嵌套多次。
比如將順序改為如下:
Widget* bWidget = new ScrollDecorator(new BorderDecorator(new ScrollDecorator(new TextField( 80, 24 ))));出現的結果就會不一樣,看一下完整的代碼。
#include <iostream>using namespace std;/* Component (interface) */ class Widget {public: virtual void draw() = 0; virtual ~Widget() {} }; /* ConcreteComponent */ class TextField : public Widget {private: int width, height;public:TextField( int w, int h ){ width = w;height = h; }void draw() { cout << "文本框: " << width << ", " << height << '\n'; } };/* Decorator (interface) */ class Decorator : public Widget {private:Widget* wid; // reference to Widgetpublic:Decorator( Widget* w ) { wid = w; }void draw() { wid->draw(); }~Decorator() {delete wid;} };/* ConcreteDecoratorA */ class BorderDecorator : public Decorator { public:BorderDecorator( Widget* w ) : Decorator( w ) { }void draw() {Decorator::draw(); cout << " 添加邊框" << '\n'; } };/* ConcreteDecoratorB */ class ScrollDecorator : public Decorator { public:ScrollDecorator( Widget* w ) : Decorator( w ) { }void draw() {Decorator::draw(); cout << " 添加滾動" << '\n';} };int main( void ) {Widget* aWidget = new BorderDecorator(new BorderDecorator(new ScrollDecorator(new TextField( 80, 24 ))));aWidget->draw();delete aWidget;Widget* bWidget = new ScrollDecorator(new BorderDecorator(new ScrollDecorator(new TextField( 80, 24 ))));bWidget->draw();delete bWidget;return 0; }看看運行結果:
可以給文本框動態的添加形態。
參考類圖如下:
適用性:
以下情況使用Decorator模式
1. 需要擴展一個類的功能,或給一個類添加附加職責。
2. 需要動態的給一個對象添加功能,這些功能可以再動態的撤銷。
3. 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變的不現實。
4. 當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。
?
優點:
1. Decorator模式與繼承關系的目的都是要擴展對象的功能,但是Decorator可以提供比繼承更多的靈活性。
2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
缺點:
1. 這種比繼承更加靈活機動的特性,也同時意味著更加多的復雜性。
2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程序變得很復雜。
3. 裝飾模式是針對抽象組件(Component)類型編程。但是,如果你要針對具體組件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行為,實現“半透明”的裝飾者模式。在實際項目中要做出最佳選擇。
總結
以上是生活随笔為你收集整理的设计模式(6)-装饰器(认识程序中的装饰器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silverlight 5 Beta 新
- 下一篇: WCF 第十二章 对等网