Идея паттерна Декоратор (Decorator)

Паттерн (шаблон) проектирования — это продуманный способ построения исходного кода программы для решения часто возникающих в повседневном программировании проблем проектирования. Иными словами, это уже придуманное решения, для типичной задачи. При этом паттерн не готовое решение, а просто алгоритм действий, который должен привести к желаемому результату. Давайте рассмотрим один из наиболее часто используемых структурных паттернов — Декоратор (Decorator).

Как я уже писал ранее, существует три вида паттернов проектирования:

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

Декоратор (Decorator)–  это структурный паттерн, который позволяет динамически в ходе выполнения расширять функционал объекта назначая дополнительные функциональные возможности. То есть, декоратор дает возможность удобно расширять функционал базового класса при необходимости.

Архитектура паттерна Декоратор (Decorator)

Давайте рассмотрим диаграмму паттерна.

Декоратор (Decorator)

Component — базовый класс компонента, чье поведение будет расширяться декораторами

Client — работает с компонентом, не зная о существовании декораторов

ConcreteComponent — конкретная реализация компонента

Decorator — базовый класс декоратора, предназначенный для расширения поведения компонента

ConcreteDecoratorA, ConcreteDecoratorB — конкретный декоратор, который добавляет декорируемому объекту специфическое поведение.

Логика работы паттерна Декоратор (Decorator)

Рассмотрим основную логику работы паттерна Декоратор. Рассмотрим совершенно обычную и повседневную ситуацию, с которой сталкивался практически любой программист – он (ну или она) проголодался и пошел в ближайший ларек за шаурмой (ну или шавермой). В продаже имеется совершено обычная шаурма, но кроме того существуют дополнительные опции, сырный или арабский лаваш, добавки в виде сыра, грибов, имбиря и аджики. И вот представьте себе, как выглядело бы меню в этом ларьке, если бы были перечислены все виды шаурмы:

  • Обычная шаурма – 100 руб.
  • Шаурма с грибами – 110 руб.
  • Шаурма с имбирем – 110 руб.
  • Шаурма с сыром – 110 руб.
  • Шаурма с грибами и сыром – 120 руб.
  • Шаурма с грибами и имбирем – 120 руб.
  • Шаурма с грибами, имбирем и сыром – 130 руб.
  • Обычная шаурма в сырном лаваше – 110 руб.
  • и так далее…

И так далее очень-очень много строчек. И чтобы запрограммировать все эти виды шармы пришлось бы создавать огромное количество классов. И для того, чтобы упростить данный механизм взаимодействия удобно использовать паттерн проектирования Декоратор, который позволит динамически определять количество добавок и варьировать от их наличия стоимость конечного продукта.

Реализация паттерна проектирования Декоратор (Decorator) на языке C#

Рассмотрим базовый класс шаурмы, который содержит в себе имя и стоимость. Это базовый класс компонента.

У базового базового класса шаурмы есть три конкретных реализации в зависимости от типа используемого лаваша. Это влияет на название и стоимость шаурмы.

Теперь рассмотрим базовый класс добавки шаурмы. Это и будет базовый класс декоратора.

И соответственно созданы необходимые конкретные реализации декораторов, которые вносят изменения в функционал основного класса шаурмы.

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

Далее для удобства и удобочитаемости кода были добавлены несколько перечислений и метод расширения, позволяющий легко выводить названия элементов перечисления на русском языке. Подробнее об этом методе можно прочитать в статье Отображение значения Enum в C# на русском.

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

Проверим работу программы.

Исходный код программы можно посмотреть в репозитории https://github.com/shwanoff/Decorator

Рекомендую также изучить статью Паттерн Наблюдатель (Observer)

P.S. Присоединяйся в любой удобной для тебя социальной сети. Для меня очень важно оставаться с тобой на связи, ведь у меня есть еще много полезной информации о программировании для тебя, которой я хочу с тобой поделиться.
[DISPLAY_ULTIMATE_PLUS]

%d такие блоггеры, как: