C# Language
Внедрение шаблона проектирования декоратора
Поиск…
замечания
Плюсы использования 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());
}
}
Запуск кода приведет к следующему выводу:
Кофе с топкой с сахаром с молоком