harry yuan
這些方法可以任意組合使用
1. 可能會一直增加處理方法
+ 翻譯
+ 分行
+ 隱藏密碼前五碼
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 呼叫下一個節點
某個類別的職責涉及了 N+1 種變化。
例如:
- N:N 種修飾方式
- 1:固定行為(一定要輸出)
1. 組合爆炸(Combinatorial Explosion)
2. 要有良好組合性(Composibility Requirement):不可一種組合做成一個 class
3. 擴充性(Extendability):Open Close Principle
如何在不修改既有程式碼之下,有效率地擴充來增加組合可能性?
1. 良好組合性與擴充性
2. 結構透明性:decorator 將 N+1 隱藏在 Component 背後,client 只要依賴 Component 就好
3. 維護性與可測試性
By Harry Yuan