Java设计模式 ---- 装饰模式
一、什么是裝飾模式?
???????裝飾模式是一種用于替代繼承的技術,它通過一種無須定義子類的方式給對象動態增加職責,使用對象之間的關聯關系取代類之間的繼承關系。
定義:動態地給一個對象增加一些額外的職責。就擴展功能而言,裝飾模式提供了一種比使用子類更加靈活的替代方案。
二、裝飾模式結構與實現
1、結構
(1)Component(抽象構件):
具體構件和抽象裝飾類的共同父類。
(2)ConcreteComponent(具體構件):
抽象構件類的子類。用于定義具體的構件對象,裝飾類可以給他增加額外的職責(方法)。
(3)Decorator(抽象裝飾類):
抽象構件類的子類,具體裝飾類的父類。用于給具體構件增加職責,但具體職責在子類中實現。它維護一個指向抽象構件對象的引用,通過該引用可以調用裝飾之前構件對象的方法,并通過其子類擴展該方法,以達到裝飾的目的。
(4)ConcreteDecorator(具體裝飾類):
抽象裝飾類的子類。負責向構件添加新的職責。每一個新的具體裝飾類都定義了一些新的行為,它可以調用在抽象裝飾類中定義的方法,并可以增加新的方法用于擴充對象的行為。
2、實現
public abstract class Component {public abstract void operation(); } public class ConcreteComponent extends Component {public void operation() {// 基本功能實現} } public class Decorator extends Component {private Component component; // 維持一個對抽象構件對象的引用// 注入一個抽象構件類型的對象public Decorator(Component component) {this.component = component;}public void operation() {component.operation(); // 調用原有業務方法} } public class ConcreteDecorator extends Decorator {public ConcreteDecorator(Component component) {super.operation(); // 調用原有業務方法addedBehavior(); // 調用新增業務方法}public void addedBehavior() {// 新增功能實現} }三、應用案例
某軟件公司基于面向對象技術開發了一套圖形界面構件庫VisualComponent,該構件庫提供了大量的基本構件,如窗體、文本框、列表框等,由于在使用該構件庫時用戶經常要求定制一些特殊的顯示效果,如帶滾動條的窗體、帶黑色邊框的文本框、既帶滾動條又帶黑色邊框的列表框等,因此經常需要對該構件庫進行擴展以增強其功能。
現使用裝飾模式來設計該圖形界面構件庫。
(1)類圖
(2)實現
四、擴展
透明裝飾模式和半透明裝飾模式
1、透明裝飾模式
在透明裝飾模式中要求客戶端完全針對抽象編程,裝飾模式的透明性要求客戶端程序不應該將對象聲明為具體構件類型或具體裝飾類型,而應該全部聲明為抽象構件類型。對客戶端而言,具體構件類和具體裝飾類對象沒有任何區別。(缺點,無法單獨調用裝飾類的獨有功能)
//不應該將對象聲明為具體構件類型或具體裝飾者類型 Window window=new Window(); //應該聲明為抽象構件類型,向上轉型 Component window=new Window();2、半透明裝飾模式
用具體裝飾類型來定義裝飾后的對象,而具體構件類型仍然可以使用抽象構件類型來定義,可以單獨調用裝飾的獨有方法。(缺點:無法多次進行裝飾)
//具體構件類型仍然可以使用抽象構件類型來定義 Component window =new Window(); //具體裝飾類型來定義裝飾后的對象 BlackBorderDec blackBorder=new BlackBorderDec(window); //可以單獨調用 blackBorder.setBlackBorder();五、裝飾模式優缺點及適用環境
(1)優點
1、裝飾模式與繼承關系的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。
2、可以通過一種動態的方式來擴展一個對象的功能,通過配置文件可以在運行時選擇不同的裝飾器,從而實現不同的行為。
3、通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可以創造出很多不同行為的組合。可以使用多個具體裝飾類來裝飾同一對象,得到功能更為強大的對象。
4、具體構件類與具體裝飾類可以獨立變化,用戶可以根據需要增加新的具體構件類和具體裝飾類,在使用時再對其進行組合,原有代碼無須改變,符合“開閉原則”。
(2)缺點
1、使用裝飾模式進行系統設計時將產生很多小對象,這些對象的區別在于它們之間相互連接的方式有所不同,而不是它們的類或者屬性值有所不同,同時還將產生很多具體裝飾類。這些裝飾類和小對象的產生將增加系統的復雜度,加大學習與理解的難度。
2、 這種比繼承更加靈活機動的特性,也同時意味著裝飾模式比繼承更加易于出錯,排錯也很困難,對于多次裝飾的對象,調試時尋找錯誤可能需要逐級排查,較為煩瑣。
(3)適用環境
1、在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
2、需要動態地給一個對象增加功能,這些功能也可以動態地被撤銷。
3、當不能采用繼承的方式對系統進行擴充或者采用繼承不利于系統擴展和維護時。不能采用繼承的情況主要有兩類:第一類是系統中存在大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長;第二類是因為類定義不能繼承(如final類)
總結
以上是生活随笔為你收集整理的Java设计模式 ---- 装饰模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用pip install安装自定义工具
- 下一篇: ANTLR介绍