# 初版设计

cost方法将计算出咖啡加上各种调料后的价格。

# 再版设计

1.调料价格变化就需要更改现有的代码。

2.一旦出现新的调料，就需要加上新的方法，并改变超类中的cost方法。

3.如果有新的饮料，有些调料可能会不适用。

4.想买双倍的摩卡咖啡怎么办？

# C#代码实现

Beverage：

namespace C03DecoratorPattern.Bases
{
public abstract class Beverage
{
protected string Description;

protected Beverage()
{
Description = "Unknown Beverage";
}

public abstract double Cost();

public virtual string GetDescription()
{
return Description;
}
}
}

CondimentDecorator：

namespace C03DecoratorPattern.Bases
{
public abstract class CondimentDecorator : Beverage
{
public abstract override double Cost();
public abstract override string GetDescription();
}
}

namespace C03DecoratorPattern.Beverages
{
public class Espresso : Beverage
{
public Espresso()
{
Description = "Espresso";
}

public override double Cost()
{
return 1.99;
}
}
}

namespace C03DecoratorPattern.Beverages
{
public class HouseBlend : Beverage
{
public HouseBlend()
{
Description = "House Blend Coffee";
}

public override double Cost()
{
return .89;
}
}
}

namespace C03DecoratorPattern.Condiments
{
public class Milk : CondimentDecorator
{

public Milk(Beverage beverage)
{
_beverage = beverage;
}

public override double Cost()
{
return .34 + _beverage.Cost();
}

public override string GetDescription()
{
return $"{_beverage.GetDescription()}, Milk"; } } } namespace C03DecoratorPattern.Condiments { public class Mocha : CondimentDecorator { private readonly Beverage _beverage; public Mocha(Beverage beverage) { _beverage = beverage; } public override double Cost() { return .2 + _beverage.Cost(); } public override string GetDescription() { return$"{_beverage.GetDescription()}, Mocha";
}
}
}

namespace C03DecoratorPattern.Condiments
{
public class Soy: CondimentDecorator
{

public Soy(Beverage beverage)
{
_beverage = beverage;
}

public override double Cost()
{
return .17 + _beverage.Cost();
}

public override string GetDescription()
{
return $"{_beverage.GetDescription()}, Soy"; } } } 测试程序： namespace C03DecoratorPattern { class Program { static void Main(string[] args) { Beverage beverage = new Espresso(); Console.WriteLine($"{beverage.GetDescription()} ${beverage.Cost()}"); Beverage beverage2 = new HouseBlend(); beverage2 = new Mocha(beverage2); beverage2 = new Milk(beverage2); beverage2 = new Soy(beverage2); Console.WriteLine($"{beverage2.GetDescription()} \$ {beverage2.Cost()}");

}
}
}

|
3月前
|
C#
C#的基本语法结构学习
【5月更文挑战第17天】C#基础语法包括变量（如int x = 10）、常量（const int MAX_VALUE = 100）、运算符（如算术和比较运算符）、控制语句（if、for、while等）和函数声明（int Add(int x, int y) { return x + y; }）。这些构成C#程序的基本元素。
56 0
|
6天前
|

C#设计模式之策略模式
C#设计模式之策略模式
56 19
|
5天前
|

C#设计模式之单例模式
C#设计模式之单例模式
14 3
|
2月前
|

21 2
|
2月前
|

16 2
|
1月前
|
Dart 算法 JavaScript
C#数据结构与算法入门教程，值得收藏学习！
C#数据结构与算法入门教程，值得收藏学习！
23 0
|
1月前
|

23种设计模式【C#代码举例】（下）
23种设计模式【C#代码举例】
20 0
|
1月前
|

23种设计模式【C#代码举例】（上）
23种设计模式【C#代码举例】（上）
17 0
|
2月前
|

GitHub突破5k Star！这件事情我坚持了3年，努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star！这件事情我坚持了3年，努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
23 3
|
2月前
|

14 0