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());
}