public static void Main()
Beverage beverage = new DarkRoast();
Console.WriteLine($"Cost of Dark Roast alone: {beverage.Cost()}");
Console.WriteLine($"Description of Dark Roast alone: {beverage.GetDescription()}");
Console.WriteLine($"Size of Dark Roast : {beverage.Size}\r\n");
beverage = new Mocha(beverage);
Console.WriteLine($"Cost of Dark Roast & Mocha: {beverage.Cost()}");
Console.WriteLine($"Description of Dark Roast & Mocha: {beverage.GetDescription()}\r\n");
beverage = new Soy(beverage);
Console.WriteLine($"Cost of Dark Roast, Mocha & Soy: {beverage.Cost()}");
Console.WriteLine($"Description of Dark Roast, Mocha & Soy: {beverage.GetDescription()}\r\n");
Beverage beverageGrande = new DarkRoast();
beverageGrande.Size = BeverageSize.GRANDE;
beverageGrande = new Mocha(beverageGrande);
beverageGrande = new Soy(beverageGrande);
Console.WriteLine($"Cost of Dark Roast, Mocha & Soy: {beverageGrande.Cost()}");
Console.WriteLine($"Description of Dark Roast, Mocha & Soy: {beverageGrande.GetDescription()}");
public abstract class Beverage
private BeverageSize size;
public virtual string GetDescription()
return "Unknown Beverage";
public abstract double Cost();
public class DarkRoast : Beverage
public override double Cost()
public override string GetDescription()
return "Dark Roast Coffee";
public abstract class CondimentDecorator : Beverage
public CondimentDecorator()
public class Mocha : CondimentDecorator
public Mocha(Beverage beverage)
this.beverage = beverage;
public override string GetDescription()
return beverage.GetDescription() + ", Mocha";
public override double Cost()
Console.WriteLine($"Debug beverage.Size value: {beverage.Size}");
return GetSize(beverage.Size);
private double GetSize(BeverageSize size)
return Convert.ToDouble(".10") +
case BeverageSize.GRANDE:
return Convert.ToDouble(".15") +
return Convert.ToDouble(".20") +
public class Soy : CondimentDecorator
public Soy(Beverage beverage)
this.beverage = beverage;
public override string GetDescription()
return beverage.GetDescription() + ", Soy";
public override double Cost()
return .25 + beverage.Cost();