概述:
爲對象動態添加功能。
裝飾者(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