裝飾模式(Decorator) 定義 裝飾模式(Decorator),動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 類圖 描述 Component:被裝飾者和裝飾者共有的基類; ConcreteComponent:被裝飾者的具體類; Decorator:裝飾類,包 ...
裝飾模式(Decorator)
定義
裝飾模式(Decorator),動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
類圖
描述
Component:被裝飾者和裝飾者共有的基類;
ConcreteComponent:被裝飾者的具體類;
Decorator:裝飾類,包含一個Component實例;
ConcreteDecorator:具體的裝飾類,其構造函數里有一個Component實例,方法可以擴展。
應用場景
下麵條的時候,可以在麵條里放入西紅柿、雞蛋等食材,如果只在麵條里放入西紅柿,就是西紅柿麵條;如果只在麵條里放入雞蛋,就是雞蛋麵條;如果在麵條里放入西紅柿和雞蛋,就是西紅柿雞蛋麵條。麵條可以看作被裝飾者,西紅柿、雞蛋則可以被看作裝飾者。
/// <summary> /// 食物 /// </summary> public abstract class Food { private string name; /// <summary> /// 食物的名稱 /// </summary> public string Name { get { return name; } set { name = value; } } public abstract void Cook(); } /// <summary> /// 麵條 /// </summary> public class Noodles : Food { public Noodles() { this.Name = "麵條"; } public override void Cook() { Console.WriteLine(this.Name); } } /// <summary> /// 食材 /// </summary> public abstract class Ingredients : Food { protected Food food; public Ingredients(Food food) { this.food = food; } } /// <summary> /// 西紅柿 /// </summary> public class Tomato : Ingredients { public Tomato(Food food) : base(food) { this.Name = "西紅柿" + this.food.Name; } public override void Cook() { Console.WriteLine(this.Name); } } /// <summary> /// 雞蛋 /// </summary> public class Egg : Ingredients { public Egg(Food food) : base(food) { this.Name = "雞蛋" + this.food.Name; } public override void Cook() { Console.WriteLine(this.Name); } }