裝飾者模式

来源:互联网 发布:vb.net 使用资源文件 编辑:程序博客网 时间:2024/06/08 14:27

OO原則:

對擴展開放,對修改關閉

 

OO模式:

裝飾者模式(Decorate),動態的將責任附加到對象上。想要擴展功能,裝飾著模式提供有別于繼承的另一種選擇

 

類結構圖:

 

星巴茲咖啡

1.Beverage飲料虛基類

/// <summary>/// Beverage 飲料虛基類/// </summary>public abstract class Beverage{    protected string description = "Unknown Beverage";    //對飲料描述    public string GetDescription()    {        return description;    }    //返回原料價格    public abstract double Cost();}

 

2.Espresso濃縮咖啡

/// <summary>/// Espresso 濃縮咖啡/// </summary>public class Espresso : Beverage{    //構造函數public Espresso(){        description = "Espresso";}    //價格    public override double Cost()    {        return 1.99;    }}


3.HouseBlend綜合咖啡

/// <summary>/// HouseBlend 綜合咖啡/// </summary>public class HouseBlend : Beverage{    //構造函數public HouseBlend(){        description = "House Blend Coffee";}    //價格    public override double Cost()    {        return 0.89;    }}


4.CondimentDecorator調料基類

/// <summary>/// CondimentDecorator 調料基類/// </summary>public abstract class CondimentDecorator : Beverage{    //public abstract string GetDescription();}


5.Milk咖啡裝飾者:牛奶

/// <summary>/// Milk 咖啡裝飾者:牛奶/// </summary>public class Milk : CondimentDecorator{    Beverage beverage;    //構造函數,傳入一個Beverage對象用於包裝    public Milk(Beverage beverage){        this.beverage = beverage;        this.description = beverage.GetDescription() + ", Milk";}    //價格    public override double Cost()    {        return 0.1 + beverage.Cost();    }}


6.Mocha咖啡裝飾者:摩卡

/// <summary>/// Mocha 咖啡裝飾者:摩卡/// </summary>public class Mocha : CondimentDecorator{    Beverage beverage;    //構造函數,傳入一個Beverage對象用於包裝public Mocha(Beverage beverage){        this.beverage = beverage;        this.description = beverage.GetDescription() + ", Mocha";}    //價格    public override double Cost()    {        return 0.2 + beverage.Cost();    }}


6.調用

//濃縮咖啡protected void Button1_Click(object sender, EventArgs e){    Beverage beverage = new Espresso();    beverage = new Mocha(beverage);    beverage = new Milk(beverage);    Response.Write(beverage.GetDescription() + "  $" + beverage.Cost());}//綜合咖啡protected void Button2_Click(object sender, EventArgs e){    Beverage beverage = new HouseBlend();    beverage = new Mocha(beverage);    Response.Write(beverage.GetDescription() + " $" + beverage.Cost());}