Introduction 簡介
- 動態的為物件增加功能
- 當有一群本質相近但又個有些不盡相同的東西的時候
Decorator Pattern
- 設計守則:open/close,擴充開放,對修改封閉,易擴充功能,且擴充時原有的code都不需修改
- Decorator Pattern中的繼承,是為了讓Decorator與被Component必須是一樣的型態
- Decorator 反映出 Component 的 type
- 方法 (行為) 是來自於 composition
- 實現方式:composition + delegation
- Decorator 可以在所委派被裝飾者的行為,之前或之後加上自己的行為@Override public String getDescription() { //return component.getDescription() + ", DecoA"; return "DecoA, " + component.getDescription(); }
- Decorator Pattern的缺點:
- Decorator會導致程式出現很多小class
Comparison 比較
- 相同點:都可以在run-time變動一個物件的特性
Decorator Pattern | Strategy Pattern |
---|---|
增加特性 | 改變特性 |
使用的人必須知道有什麼strategy option,跟現在apply了哪一個strategy (就是你必須有一個strategy物件) |
但Decorator Pattern不用 因為Decorator像是從外面改變了這個object (被包了一層) |
換了骨頭 | 換皮變臉 |
Example 範例
-
SideDish 副餐為裝飾者
-
起司、火腿 為裝飾者
Code 程式碼範例
Reference 參考資料
- 圖片:https://stackoverflow.com/questions/43565475/using-lists-instead-of-decorator-pattern
- 裝飾者模式筆記:https://dotblogs.com.tw/pin0513/archive/2010/01/04/12779.aspx
- 設計模式之Decorator(油漆工):http://www.dotspace.idv.tw/Patterns/Jdon_Decorator.htm
- 比較 策略 vs 裝飾者:https://stackoverflow.com/questions/26422884/strategy-pattern-v-s-decorator-pattern
- 比較:https://www.jyt0532.com/2017/04/18/decorator/
- 範例圖片:https://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
沒有留言:
張貼留言