標籤:style blog http color 使用 os 2014 ar
看到別人寫的,都看不進去,算了還是自己手寫一遍吧,算是協助自己理解了。寫的比較簡單,例子也比較好懂,什麼時候使用自己看著辦。
1.定義
裝飾者模式:動態地將職責附加到對象上。若要擴充功能,裝飾者提供比繼承更有彈性的替代方案。
裝飾者和被裝飾者對象都喲相同的超類。
裝飾者會使程式中出現很多小類,增加使用難度
可以透明的插入裝飾者,客戶都不知道是和裝飾者打交道
2:使用情境
對象由主體+許多可選的組件或者功能構成,使用繼承或者介面會產生很多類,且很難擴充。
例如,現在需要一杯飲料,主體是水,可以選擇添加甜味、鹹等其他味道,這種情況下就可以使用裝飾者模式。
3:代碼實現
基類,抽象類別
public abstract class Drink { public string DrinkName = ""; //直接列印出名稱 public void PrintName() { Console.WriteLine(DrinkName); } public abstract double Cost(); }
被裝飾者,水。也可以是茶和其他的飲料
public class Water : Drink { public Water() { DrinkName = "水"; } public override double Cost() { return 2; } }
裝飾者,加糖,鹽等
/// <summary> /// 甜味,每份2元,有點貴額 /// </summary> public class Sweet:Drink { private Drink BaseDrink; public Sweet(Drink drink) { BaseDrink = drink; DrinkName = " 加糖"+BaseDrink.DrinkName; } public override double Cost() { return BaseDrink.Cost()+2; } }
/// <summary> /// 加鹽 /// </summary> public class Salt : Drink { private Drink BaseDrink; public Salt(Drink drink) { BaseDrink = drink; DrinkName = " 加鹽"+BaseDrink.DrinkName ; } public override double Cost() { return BaseDrink.Cost() + 1; } }
老闆來一份 加一份鹽,2份甜味的水,這個味道重口味額
static void Main(string[] args) { Drink OrderDrink = new Water(); OrderDrink = new Sweet(OrderDrink); OrderDrink = new Sweet(OrderDrink); OrderDrink = new Salt(OrderDrink); OrderDrink.PrintName(); Console.WriteLine("您所需的價錢為:"+OrderDrink.Cost()); Console.ReadKey(); }
好了,飲料來了,付錢吧!騷年...