Decorator 裝飾者模式

harry yuan

需求:聊天室傳送訊息

  1. 可以使用 discord / slack 發送
  2. 除了「發送」,訊息需要提供各種處理方法:
  • 隱藏 email
  • 訊息格式化 [YYYY-MM-DD]
  • 分段 \n

 

這些方法可以任意組合使用

需求:新的需求

1. 可能會一直增加處理方法

  • 隱藏 email
  • 訊息格式化 [YYYY-MM-DD]
  • 分段 \n

+ 翻譯

+ 分行

+ 隱藏密碼前五碼

 

2. 希望可以讓用戶任意組合

class 組合爆炸:C(n,k)

解法:裝飾者

情境為:N + 1

N:N種對元件的修飾動作

1:固定需要的動作

 

定義元件介面:Message

定義 Decorator 介面: 每種組合

重構三步驟

1. Encapsulate what varies

2. Abstract common behaviors

3. Delegation / Composite

經過 1、2 以後長這樣

下一步希望:多種處理後 -> 送出

  process(messages) {

    // custom processing

    if(this.next) this.next.process(messages)

 

做成樹狀結構

從 processor 到 messenger 都是呼叫 process()

每個節點都透過 send 呼叫下一個節點

Context

某個類別的職責涉及了 N+1 種變化。

例如:

- N:N 種修飾方式

- 1:固定行為(一定要輸出)

Force

1. 組合爆炸(Combinatorial Explosion)

2. 要有良好組合性(Composibility Requirement):不可一種組合做成一個 class

3. 擴充性(Extendability):Open Close Principle

Problem

如何在不修改既有程式碼之下,有效率地擴充來增加組合可能性?

Resulting Context

1. 良好組合性與擴充性

2. 結構透明性:decorator 將 N+1 隱藏在 Component 背後,client 只要依賴 Component 就好

3. 維護性與可測試性

 

Decorator 設計者模式

By Harry Yuan

Decorator 設計者模式

  • 119