public static void Main()
MakeCaramelCashewSundae();
private static void MakeTurtleSundae()
Pecans turtleSundae = new Pecans(new HotFudge(new Caramel(new Vanilla(new Icecream()))));
Console.WriteLine("Turtle Sundae:");
Console.WriteLine(string.Format(" {0} {1}", turtleSundae.GetName(), String.Format("{0:C}", turtleSundae.GetPrice())));
private static void MakeCaramelCashewSundae()
SeniorDiscount caramelCashewSundae = new SeniorDiscount(new SalesTax(new Cashews(new Caramel(new Vanilla(new Icecream())))));
Console.WriteLine("Caramel Cashew Sundae:");
Console.WriteLine(string.Format(" {0} {1}", caramelCashewSundae.GetName(), String.Format("{0:C}", caramelCashewSundae.GetPrice())));
public abstract class Component
public abstract string GetName();
public abstract double GetPrice();
public class Icecream : Component
private string m_Name = "Icecream";
private double m_Price = 2.0;
public override string GetName()
public override double GetPrice()
public abstract class Decorator : Component
protected Component m_component;
protected string m_Name = "Undefined Decorator";
protected double m_Price = 0.0;
protected Decorator(Component component)
public override string GetName()
return string.Format("{0}, {1}", m_component.GetName(), m_Name);
public override double GetPrice()
return m_Price + m_component.GetPrice();
public class Vanilla : Decorator
public Vanilla(Component component)
public class Chocolate : Decorator
public Chocolate(Component component)
this.m_Name = "Chocolate";
public class Cream : Decorator
public Cream(Component component)
public class Cashews : Decorator
public Cashews(Component component)
public class Pecans : Decorator
public Pecans(Component component)
public class Caramel : Decorator
public Caramel(Component component)
public class HotFudge : Decorator
public HotFudge(Component component)
this.m_Name = "Hot Fudge";
public class SalesTax : Decorator
public SalesTax(Component component)
this.m_Name = "Sales Tax";
public override double GetPrice()
return base.GetPrice() * ( 1 + m_Price);
public class SeniorDiscount : Decorator
public SeniorDiscount(Component component)
this.m_Name = "Senior Discount";
public override double GetPrice()
return base.GetPrice() - ( base.GetPrice() * m_Price);