Поиск…


замечания

Плюсы использования Decorator:

  • вы можете добавлять новые функции во время выполнения в разных конфигурациях
  • хорошая альтернатива для наследования
  • клиент может выбрать конфигурацию, которую он хочет использовать

Моделирование столовой

Декоратор - один из структурных шаблонов дизайна. Он используется для добавления, удаления или изменения поведения объекта. В этом документе вы узнаете, как правильно использовать Decorator DP.

Позвольте мне объяснить вам это на простом примере. Представьте, что вы сейчас в знаменитой кофейной компании Starbobs. Вы можете заказать заказ на любой кофе, который вы хотите - со сливками и сахаром, со сливками и топпингом и намного больше комбинаций! Но в основе всех напитков кофе - темный, горький напиток, вы можете изменить. Давайте напишем простую программу, имитирующую кофеварку.

Во-первых, нам нужно создать и абстрактный класс, который описывает наш базовый напиток:

public abstract class AbstractCoffee
{
    protected AbstractCoffee k = null;

    public AbstractCoffee(AbstractCoffee k)
    {
        this.k = k;
    }

    public abstract string ShowCoffee();
}

Теперь давайте создадим некоторые дополнительные услуги, такие как сахар, молоко и топпинг. Созданные классы должны реализовать AbstractCoffee - они украсят его:

public class Milk : AbstractCoffee
{
    public Milk(AbstractCoffee c) : base(c) { }
    public override string ShowCoffee()
    {
        if (k != null)
            return k.ShowCoffee() + " with Milk";
        else return "Milk";
    }
}
public class Sugar : AbstractCoffee
{
    public Sugar(AbstractCoffee c) : base(c) { }

    public override string ShowCoffee()
    {
        if (k != null) return k.ShowCoffee() + " with Sugar";
        else return "Sugar";
    }
}
public class Topping : AbstractCoffee
{
    public Topping(AbstractCoffee c) : base(c) { }

    public override string ShowCoffee()
    {
        if (k != null) return k.ShowCoffee() + " with Topping";
        else return "Topping";
    }
}

Теперь мы можем создать наш любимый кофе:

public class Program
{
    public static void Main(string[] args)
    {
        AbstractCoffee coffee = null; //we cant create instance of abstract class
        coffee = new Topping(coffee); //passing null
        coffee = new Sugar(coffee); //passing topping instance
        coffee = new Milk(coffee);  //passing sugar
        Console.WriteLine("Coffee with " + coffee.ShowCoffee());

    }
}

Запуск кода приведет к следующему выводу:

Кофе с топкой с сахаром с молоком



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow