/// <summary> /// 飲料抽象類 /// </summary> public abstract class Beverage { protected string description = "Unknown Beverage!"; public string getDescription() { return description; } public abstract double cost(); } /// <summary> /// 調料抽象類 /// </summary> public abstract class CondimentDecorator : Beverage { public new abstract string getDescription(); } /// <summary> /// 濃縮咖啡 /// </summary> public class Espresso : Beverage { public Espresso() { description = "Espresso"; } public override double cost() { return 1.99; } } public class HouseBlend : Beverage { public HouseBlend() { description = "HouseBlend"; } public override double cost() { return 0.89; } } public class Mocha:CondimentDecorator { Beverage beverage; public Mocha(Beverage b) { this.beverage = b; } public override string getDescription() { return beverage.getDescription() + ",Mocha"; } public override double cost() { return 0.2 + beverage.cost(); } } public class Soy : CondimentDecorator { Beverage beverage; public Soy(Beverage b) { this.beverage = b; } public override string getDescription() { return beverage.getDescription() + ",Soy"; } public override double cost() { return 0.8 + beverage.cost(); } } public class Whip : CondimentDecorator { Beverage beverage; public Whip(Beverage b) { this.beverage = b; } public override string getDescription() { return beverage.getDescription() + ",Whip"; } public override double cost() { return 1.8 + beverage.cost(); } } public void main(){ //濃縮咖啡 不加調料 Beverage beverage = new Espresso(); Debug.WriteLine(beverage.getDescription() + ":" + beverage.cost().ToString()); Beverage beverage2 = new HouseBlend(); beverage2 = new Soy(beverage2); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); Debug.WriteLine(beverage2.getDescription() + ":" + beverage2.cost().ToString()); }
開放-關閉原則:類應該對擴展開放,對修改關閉;ide
裝飾者模式:動態的將責任附加到對象上。想要擴展功能,裝飾者提供有別於繼承的另外一種選擇;this