public static void Main()
Pizza largePizza = new LargePizza();
largePizza = new Ham(largePizza);
largePizza = new Cheese(largePizza);
Console.WriteLine(largePizza.GetDescription());
Console.WriteLine("{0:C2}", largePizza.CalculateCost());
public abstract class Pizza
public string Description { get; set; }
public abstract string GetDescription();
public abstract double CalculateCost();
public class SmallPizza : Pizza
Description = "Small Pizza";
public override string GetDescription()
public override double CalculateCost()
public class LargePizza : Pizza
Description = "Large Pizza";
public override string GetDescription()
public override double CalculateCost()
public class PizzaDecorator : Pizza
public PizzaDecorator(Pizza pizza)
public override string GetDescription()
return _pizza.Description;
public override double CalculateCost()
return _pizza.CalculateCost();
public class Peppers : PizzaDecorator
public Peppers(Pizza pizza)
public override string GetDescription()
return string.Format("{0}, {1}", _pizza.GetDescription(), Description);
public override double CalculateCost()
return _pizza.CalculateCost() + 2.00;
public class Ham : PizzaDecorator
public override string GetDescription()
return string.Format("{0}, {1}", _pizza.GetDescription(), Description);
public override double CalculateCost()
return _pizza.CalculateCost() + 2.50;
public class Cheese : PizzaDecorator
public Cheese(Pizza pizza)
public override string GetDescription()
return string.Format("{0}, {1}", _pizza.GetDescription(), Description);
public override double CalculateCost()
return base.CalculateCost() + 1.25;