06-裝飾者模式(Decorator)

概述:

爲對象動態添加功能。

裝飾者(Decorator)和具體組件(ConcreteComponent)都繼承自組件(Component),具體組件的方法實現不需要依賴於其它對象,而裝飾者組合了一個組件,這樣它可以裝飾其它裝飾者或者具體組件。所謂裝飾,就是把這個裝飾者套在被裝飾者之上,從而動態擴展被裝飾者的功能。裝飾者的方法有一部分是自己的,這屬於它的功能,然後調用被裝飾者的方法實現,從而也保留了被裝飾者的功能。可以看到,具體組件應當是裝飾層次的最低層,因爲只有具體組件的方法實現不需要依賴於其它對象。

 

定義:

在不改變原有對象的基礎之上,將功能附加到對象上

提供了比繼承更有彈性的替代方案(擴展原有對象功能)

 

適用場景 

擴展一個類的功能或給一個類添加附加職責

動態的給一個對象添加功能,這些功能可以再動態的撤銷

 

優點 

繼承的有力補充,比繼承靈活,不改變原有對象的情況下給一個對象擴展功能

通過使用不同裝飾類以及這些裝飾類的排列組合,可以實現不同效果

符合開閉原則

 

缺點

會出現更多的代碼,更多的類,增加程序複雜性

動態裝飾時,多層裝飾時會更復雜

 

 

 

設計原則

類應該對擴展開放,對修改關閉:也就是添加新功能時不需要修改代碼。飲料可以動態添加新的配料,而不需要去修改飲料的代碼。

不可能把所有的類設計成都滿足這一原則,應當把該原則應用於最有可能發生改變的地方。

 

示例DEMO&UML

 

源代碼地址:https://github.com/NoSuchClass/design_pattern/tree/master/src/structural/decorator

 

In JDK

* java.io.BufferedInputStream(InputStream)

* java.io.DataInputStream(InputStream)

* java.io.BufferedOutputStream(OutputStream)

* java.util.zip.ZipOutputStream(OutputStream)

* java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章