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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

扩展系统功能--装饰模式

發布時間:2025/5/22 windows 191 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扩展系统功能--装饰模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對已有對象的功能進行擴展(裝飾)。以獲得更加符合用戶需求的對象,使得對象具有更加強大的功能,這就是裝飾模式。

基于繼承的復用缺點:

(1) 系統擴展麻煩。在某些編程語言中無法實現(多繼承問題)。

(2) 代碼反復,不利于對系統進行改動和維護。 (3) 系統龐大,類的數目許多。

裝飾模式概述


依據合成復用原則,在實現功能復用時。多用關聯(組合),少用繼承。 裝飾類作用:對原有對象進行裝飾。通過裝飾來擴展原有對象的功能。

裝飾模式能夠在不改變一個對象本身功能的基礎上給對象添加額外的行為。 裝飾模式是一種用于替代繼承的技術,它通過一種無須定義子類的方式給對象動態的添加職責,使用對象之間的關聯關系代替類之間的繼承關系。在裝飾模式中引入了裝飾類,在裝飾類中既能夠調用待裝飾的原有類的方法,還能夠添加新的方法,以擴充原有類的功能。

裝飾模式定義:

動態的給一個對象添加一些額外的職責,就添加對象功能來說。裝飾模式比生產子類更方便。

在裝飾模式中,為了讓系統具有更好的靈活性和可擴展性,一般會定義一個抽象裝飾類。而將詳細的裝飾類作為它的子類。


裝飾模式結構圖

裝飾模式結構圖例如以下:
在裝飾模式結構圖中包括下面4個角色:
(1) Component(抽象構件):它是詳細構件和抽象裝飾類的共同父類。聲明了在詳細構件中實現的業務方法。它的存在使client以一致的方式處理未被裝飾的對象以及裝飾之后的對象,實現client的透明操作。

(2) ConcreteComponet(詳細構件):它是抽象構件的子類,用于定義詳細的構件對象,實現了在抽象構件中聲明的方法,裝飾器能夠給它添加額外的職責。

(3) Decorator(抽象裝飾類):它也是抽象構件類的子類,用于給詳細構件類加入新的職責,但詳細職責在其子類中實現。

它維護一個指向抽象構件類的引用,通過該引用能夠調用裝飾之前的對象的方法,并通過其子類擴展該方法,以達到裝飾的目的

(4)? ConcreteDecorator(詳細裝飾類):它是抽象裝飾類的子類,負責向構件加入新的職責。每個詳細裝飾類都定義了一些新的行為,能夠調用在抽象裝飾類中定義的方法,并能夠添加新的方法用以擴充對象的行為。
因為詳細構件類和裝飾類都實現了同樣的抽象構件接口,因此裝飾模式以對客戶透明的方式動態地給一個對象加入額外的職責,換言之,client并不會覺對象在裝飾前和裝飾后有什么差別

透明裝飾模式與半透明裝飾模式


1.透明裝飾模式
在透明裝飾模式中,要求client全然針對抽象編程。

裝飾模式的透明性要求client不應該講對象聲明為詳細構件類型或者詳細裝飾類型。而應該所有聲明為抽象構件類型。對client而言,詳細構件對象和詳細裝飾對象沒有不論什么差別。透明裝飾模式能夠使client透明地使用裝飾之前的對象和裝飾之后的對象,無須關心它們的差別。

此外,還能夠對一個已經裝飾過的對象多次裝飾,得到更為復雜、功能更加強大的對象。在實現透明裝飾模式時,要求詳細裝飾類的operation()方法覆蓋抽象裝飾類的operation()方法。除了調用原有對象的operation()方法外還須要調用新增的addedBehavior()方法來添加新的行為。

2.半透明裝飾模式
為了單獨調用新添加的方法,不得不用詳細裝飾類型來定義裝飾之后的對象,而詳細構件類型還是能夠使用抽象構件類型來定義。這樣的裝飾模式即是半透明裝飾模式。也就是說,對于client而言。詳細構件類型無須關心,是透明的;可是詳細裝飾類型必須指定,是不透明的。

半透明裝飾模式能夠給系統帶來更大的靈活性,設計相對簡單,使用起來也很方便;可是其最大的缺點在于不能實現對同一個對象多次裝飾,并且client有差別的對待裝飾之前和裝飾之后的對象。在實現半透明裝飾模式時,僅僅須要在詳細裝飾類中添加一個獨立的addedBehavior()方法來封裝對應的業務處理,因為client使用詳細裝飾類型定義裝飾后的對象。因此能夠單獨地調用addedBehavior()方法來擴展系統功能。


裝飾模式注意事項


(1) 盡量保持裝飾類的接口與被裝飾類的接口同樣,這樣。對于client而言。不管是裝飾之前的對象還是裝飾之后的對象都能一致對待。 (2) 盡量保持詳細構件類ConcreteComponent是一個“輕”類。不要把太多的行為放在詳細構件類中。能夠通過裝飾類對其進行擴展。

(3) 假設僅僅有一個詳細構件類。那么抽象裝飾類能夠作為該詳細構件類的直接子類。


裝飾模式總結


裝飾模式減少了系統的耦合度,能夠動態的添加或刪除對象的職責。在軟件開發中,裝飾模式應用廣泛,比如在javax.swing包中一些圖形界面構件功能的增強。

主要長處

(1) 對于擴展一個對象的功能。裝飾模式比繼承更加靈活性,不會導致類的個數急劇添加。 (2) 能夠多一個對象多次裝飾。通過使用不同的詳細裝飾類以及這些裝飾類的排列組合,能夠創造出非常多不同行為的組合,得到功能更為強大的對象。

主要缺點

(1) 對于多次裝飾的對象。調試尋找錯誤可能須要逐級排查,較為繁瑣。


適用場景

(1) 在不影響其他對象的前提下,以動態、透明的方式給單個對象加入職責。 (2) 當不能採用繼承的方式對系統進行擴展或者採用繼承不利于系統的擴展和可維護性時能夠使用裝飾模式。

裝飾模式的應用



裝飾模式結構圖例如以下:


透明裝飾模式演示樣例代碼例如以下:
#include <iostream> using namespace std; //抽象界面構件類:抽象構件類 class Component{ public:virtual void display()=0; };//窗口類:詳細構件類 class Window :public Component{ public:void display(){cout<<"顯示窗口!"<<endl;} };//文本框類:詳細構件類 class TextField:public Component{ public:void display(){cout<<"顯示文本框"<<endl;} };//列表框類:詳細構件類 class ListBox : public Component{ public:void display(){cout<<"顯示文本框"<<endl;} };//構件裝飾類:抽象裝飾者類class Decorator : public Component{ private:Component *component; //維持對抽象構件類型的引用 public://通過構造函數注入抽象構件類型的對象Decorator(Component *com):component(com){}/***在Decorator類中并未真正實現display()方法。僅僅是調用原有component的display()方法。它沒有真正實施裝飾。而是提供一個統一的接口,將詳細裝飾過程交給其子類處理。*/void display(){component->display(); //調用原有對象的業務方法} };//滾動欄裝飾類:詳細裝飾者類 class ScrollBarDecorator : public Decorator{ public:ScrollBarDecorator(Component *com):Decorator(com){}void adderScrollBar(){cout<<"添加滾動欄"<<endl;}void display(){adderScrollBar();Decorator::display();} };//黑色邊框裝飾類:詳細裝飾者類 class BlackBorderDecorator : public Decorator{ public:BlackBorderDecorator(Component *com):Decorator(com){}void addBlackBorder(){cout<<"添加黑色邊框"<<endl;}void display(){addBlackBorder();Decorator::display();} };//client測試代碼 int main() {Component *origin,*oriScroll,*oriScrollBlack; //所有使用抽象構件定義origin=new Window(); //定義詳細構件oriScroll=new ScrollBarDecorator(origin); //定義裝飾后的構件oriScrollBlack=new BlackBorderDecorator(oriScroll); //將裝飾了一次之后的對象繼續注入到還有一個類中,進行第2次裝飾oriScrollBlack->display();return 0; }
半透明裝飾模式演示樣例代碼例如以下: #include <iostream> using namespace std; //抽象界面構件類:抽象構件類 class Component{ public:virtual void display()=0; };//窗口類:詳細構件類 class Window :public Component{ public:void display(){cout<<"顯示窗口!"<<endl;} };//文本框類:詳細構件類 class TextField:public Component{ public:void display(){cout<<"顯示文本框"<<endl;} };//列表框類:詳細構件類 class ListBox : public Component{ public:void display(){cout<<"顯示文本框"<<endl;} };//滾動欄裝飾類:裝飾者類 class ScrollBarDecorator{ private:Component *component; public:ScrollBarDecorator(Component *com):component(com){}void adderScrollBar(){cout<<"添加滾動欄"<<endl;}void display(){adderScrollBar();component->display();} };//黑色邊框裝飾類:裝飾者類 class BlackBorderDecorator { private:Component *component; public:BlackBorderDecorator(Component *com):component(com){}void addBlackBorder(){cout<<"添加黑色邊框"<<endl;}void display(){addBlackBorder();component->display();} };int main(){Component *origin;ScrollBarDecorator *oriScroll;BlackBorderDecorator *oriScrollBlack;origin=new Window();oriScroll=new ScrollBarDecorator(origin);oriScroll->display();oriScroll->adderScrollBar();return 0; }

總結

以上是生活随笔為你收集整理的扩展系统功能--装饰模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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