裝飾模式是為已有功能動態的添加更多功能的一種方式。 當系統需要新功能的時候,是向舊的類中添加新的代碼,而這些新的代碼通常裝飾了原有類的核心職責或者主要行為, 這些新的邏輯增加了主類的複雜度,但是它們僅僅是滿足一些只在某這特定情況下才會執行的特殊行為的需要,且先後執行順序不確定。 這樣,每個要裝飾的功 ...
裝飾模式是為已有功能動態的添加更多功能的一種方式。
當系統需要新功能的時候,是向舊的類中添加新的代碼,而這些新的代碼通常裝飾了原有類的核心職責或者主要行為, 這些新的邏輯增加了主類的複雜度,但是它們僅僅是滿足一些只在某這特定情況下才會執行的特殊行為的需要,且先後執行順序不確定。 這樣,每個要裝飾的功放在單獨的類中,並設置這個類需要裝飾的對象,當需要執行特殊行為時,客戶端代碼就可以在運行時根據需要,有選擇按順序的使用裝飾功能包裝的對象了。
裝飾模式的優點是把類中的裝飾功能從類中搬移出去,簡化了原有的類,並把核心功能和裝飾功能區分開來。
使用裝飾模式實現給人穿衣服的例子:
首先定義被裝飾類:
/// <summary> /// 裝飾類與被裝飾類的介面,定義了被裝飾對象和裝飾類的職責 /// </summary> public interface IComponent { void Show(); } /// <summary> /// 被裝飾的類 /// </summary> public class Person:IComponent { private string name; public Person(string name) { this.name = name; } /// <summary> /// 核心功能 /// </summary> public virtual void Show() { Console.WriteLine("Name: {0}", name); } }
定義裝飾類:
/// <summary> /// 裝飾類的基類,設置需要裝飾的對象,並提供調用被裝飾類的核心功能的方法 /// </summary> public class Decorator:IComponent { protected IComponent component; public Decorator(IComponent component) { this.component = component; } public virtual void Show() { if (component!=null) { component.Show(); } } } /// <summary> /// 裝飾類的實現,在調用被裝飾對象的核心方法後,又執行被裝飾類中的其它功能,即裝飾功能 /// </summary> public class TshirtDecorator : Decorator { public TshirtDecorator(IComponent component) : base(component) { } public override void Show() { base.Show(); Console.WriteLine("Put on TShirt"); } } public class TrouserDecorator : Decorator { public TrouserDecorator(IComponent component) : base(component) { } public override void Show() { base.Show(); Console.WriteLine("Put on Trouser"); } } public class ShoesDecorator : Decorator { public ShoesDecorator(IComponent component) : base(component) { } public override void Show() { base.Show(); Console.WriteLine("Put on Shoes"); } }
使用裝飾類實現裝飾功能
Person kelly = new Person("Kelly"); TshirtDecorator tshirt = new TshirtDecorator(kelly); TrouserDecorator trouser = new TrouserDecorator(tshirt); ShoesDecorator shoes = new ShoesDecorator(trouser); shoes.Show();
運行結果為:
Name: Kelly
Put on TShirt
Put on Trouser
Put on Shoes