定義:
在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。
如一個典型的應用場景,機房伺服器發生故障後,給使用者發郵件提醒,再又要加上簡訊提醒,提醒完成後再生成故障報表。
適用:
動態給類新增功能,還可以撤銷。
注意:
注意裝飾先後順序,如一個典型的應用場景,機房伺服器發生故障後,給使用者發郵件提醒,再又要加上簡訊提醒,提醒完成後再生成故障報表。若是不滿足發郵件的條件,就不用發簡訊和生成報表。最後執行的功能總是被最先裝飾。
裝飾模式結構:
核心在Decorator類上,
protected Component component; public void SetDecorator(Component component) { this.component = component; }
public override void Notice() { if (this.component!=null) { this.component.Notice(); } }
也可以把裝飾邏輯放到具體的裝飾類上:
protected Component component; public void SetDecorator(Component component) { this.component = component; }
把這一段放到具體的裝飾者類中。
ConcreteComponent:讓Decorator物件為自己新增功能。有時候使用ConcreteComponent的派生類提供核心功能,在這種情況就是用ConcreteComponent替代了Component的功能,而且裝飾者是繼承於ConcreteComponent的子類。
Component:定義ConcreteComponent和Decorator類要實現的方法,簡單來說如果一個類繼承於該類就具有裝飾或被裝飾能力。
Decorator:具有特定裝飾功能的類,用來裝飾ConcreteComponent類。
關於裝飾者模式,推薦閱讀:http://www.cnblogs.com/rush/archive/2011/05/08/Decorator_DesignPattern_NETFramework.html
學習設計模式的最大體會就是如果能靈活運用到實際開發中去,說明就掌握了,所以一定要鄞練習,多思考。