「Decorator Pattern動態地將責任加諸於物件上。

若要擴充功能,裝飾者提供了比繼承更有彈性的選擇」

 

Decorator目的是將額外的權責動態附加於物件身上,

不必衍生子類別即可彈性擴增功能

 

Class Diagram

Decorator Pattern.png

 

Example

假設我們有一個聖誕樹,

我們想用tree topper(通常是聖誕樹最上面的星星)、tinsel(閃光紙裝飾物)、garland(花環)、bubble lights(燈泡)來裝飾聖誕樹

ChristmasTree.png

 

 

首先建立聖誕樹的介面

christmas tree.png

 

以及該介面的實作

ChristmasTreeImpl.png

 

接著我們實作TreeDecorator抽象類別,並且實作ChristmasTree介面

將ChristmasTree利用建構子注入進來

TreeDecorator.png

 

接著我們建構一些裝飾元素,這些裝飾會繼承TreeDecorator

並根據我們的需求修改decorate() 方法

TreeTop.png

Tinsel.png

Garland.png

BubbleLights.png

 

最後我們透過一個測試來看Client是如何裝飾聖誕樹的

Test.png

 

小結

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/

arrow
arrow

    Mark Zhang 發表在 痞客邦 留言(0) 人氣()