日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式(6)-装饰器(认识程序中的装饰器)

發布時間:2025/3/21 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(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)-装饰器(认识程序中的装饰器)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。