「Decorator Pattern動態地將責任加諸於物件上。
若要擴充功能,裝飾者提供了比繼承更有彈性的選擇」
Decorator目的是將額外的權責動態附加於物件身上,
不必衍生子類別即可彈性擴增功能
Class Diagram
Example
假設我們有一個聖誕樹,
我們想用tree topper(通常是聖誕樹最上面的星星)、tinsel(閃光紙裝飾物)、garland(花環)、bubble lights(燈泡)來裝飾聖誕樹
首先建立聖誕樹的介面
以及該介面的實作
接著我們實作TreeDecorator抽象類別,並且實作ChristmasTree介面
將ChristmasTree利用建構子注入進來
接著我們建構一些裝飾元素,這些裝飾會繼承TreeDecorator
並根據我們的需求修改decorate() 方法
最後我們透過一個測試來看Client是如何裝飾聖誕樹的
小結
1. 可以在run-time把Decorator加上去,可以依照你的需求去安排
2. 達到開放封閉守則(Open-Close)。Open decorator, close component,
如果要新增更多裝飾,只要實作新的Decorator,而不用改到ChristmasTree就可以為聖誕樹再添加新的裝飾了
3. 缺點是會實作了很多相似的Decorator,Class會越來越多
4. Decorator看起來好像和上次介紹的Proxy Pattern有點像,都是想要保護原本的物件,不受到外部需求改變,但是又想對這物件添加功能
Proxy是控制它包覆物件的存取,代表了真實的物件,而Decorator是基於原本的功能動態增加了物件功能或行為
Ref:
[1] https://www.baeldung.com/java-decorator-pattern
[2] https://www.jyt0532.com/2017/04/18/decorator/
留言列表