Decorator 模式 (結構性模型)
以對用戶端透明的方式動態為對象附加責任。此模式提供了一個比繼承更為靈活的替代方案來擴充項物件的功能。雖然與適配器一樣的被稱作封裝者(wrapper)但他們本質有區別。適配器要改變所考慮對象介面,而不一定改變對象的效能;裝飾者是要保持對象介面,從而增強對象效能。
通過採用組合而非繼承的手法, Decorator模式實現了在運行時動態擴充項物件功能的能力,而且可以根據需要擴充多個功能。避免了使用繼承帶來的“靈活性差”和“多子類衍生問題”。
Decorator類在介面上表現為is-a Component的繼承關係,即Decorator類繼承了Component類所具有的介面。但在實現上又表現為has-a Component的組合關係,即Decorator類又使用了另外一個Component類。
Decorator模式並非解決“多子類衍生的多繼承”問題,Decorator模式應用的要點在於解決“主體類在多個方向上的擴充功能”——是為“裝飾”的含義。
適用情況:
1.在不影響其他對象的情況下,動態且透明的增加一個責任到一個對象。
2.希望責任和功能可以隨時增加或取消。
3.當無法通過類的繼承來擴充功能時。(繼承過多;類的定義被隱藏;類的定義不便於產生衍生類別)
結構:
1.抽象組件(CComponent):定義一個對象介面,可以動態附加責任到其他對象上。
2.具體組件(CConcreteComponent):定義可以被附加責任的對象。
3.裝飾者(CDecorator):維護一個到抽象組件對象的引用,並定義與抽象組件介面一致的介面,以便“裝飾”抽象組件對象的介面。
4.具體裝飾者(CConcreteDecorator):附加責任到抽象組件,完成具體的“裝飾”。
1.適用性
在以下情況下應當使用裝飾模式:1.需要擴充一個類的功能,或給一個類增加附加責任;2.需要動態地給一個對象增加功能,這些功能可以再動態地撤銷;3.需要增加由一些準系統的排列組合而產生的非常大量的功能,從而使繼承關係變得不現實。
2.實現要點
讓裝飾角色還繼承抽象構件角色也是裝飾模式最大的特點,目的就是給抽象構件增加職責,對外表現為裝飾後的構件;
讓裝飾角色擁有構件角色執行個體的目的就是讓構件能被多個裝飾對象來裝飾;
在具體應用中可以靈活一點,不一定要有抽象構件和裝飾角色。但是,裝飾對象繼承裝飾對象並且擁有它執行個體的兩大特點需要體現;
透明裝飾一般通過在基類方法前後進行擴充實現,半透明裝飾一般通過新的介面實現。
其它瀏覽
奇幻RPG(物品鍛造 與 Decorator模式)
.NET設計模式(10):裝飾模式(Decorator Pattern)
.Net中的設計模式——Decorator模式(此書作者的BLOG)
參考文章
9.Decorator(裝飾者模式)
設計模式學習筆記十五:裝飾模式(Decorator Pattern)