public static void Main(string[] args)
Pizza pizza1 = new ItalianPizza();
pizza1 = new TomatoPizza(pizza1);
Console.WriteLine("Название: {0}", pizza1.Name);
Console.WriteLine("Цена: {0}", pizza1.GetCost());
Pizza pizza2 = new ItalianPizza();
pizza2 = new CheesePizza(pizza2);
Console.WriteLine("Название: {0}", pizza2.Name);
Console.WriteLine("Цена: {0}", pizza2.GetCost());
Pizza pizza3 = new BulgerianPizza();
pizza3 = new TomatoPizza(pizza3);
pizza3 = new CheesePizza(pizza3);
Console.WriteLine("Название: {0}", pizza3.Name);
Console.WriteLine("Цена: {0}", pizza3.GetCost());
public string Name {get; protected set;}
public abstract int GetCost();
class ItalianPizza : Pizza
public ItalianPizza() : base("Итальянская пицца")
public override int GetCost()
class BulgerianPizza : Pizza
: base("Болгарская пицца")
public override int GetCost()
abstract class PizzaDecorator : Pizza
public PizzaDecorator(string n, Pizza pizza) : base(n)
class TomatoPizza : PizzaDecorator
public TomatoPizza(Pizza p)
: base(p.Name + ", с томатами", p)
public override int GetCost()
return pizza.GetCost() + 3;
class CheesePizza : PizzaDecorator
public CheesePizza(Pizza p)
: base(p.Name + ", с сыром", p)
public override int GetCost()
return pizza.GetCost() + 5;