Шаблон декоратора - когда использовать (определить ситуацию с шаблоном)

Цель этой статьи с практическими рекомендациями - показать, как определить возможность использования шаблона декоратора.

Если вы новичок в этом шаблоне проектирования, я рекомендую видео Кристофера Охрави, в котором он очень хорошо объясняется: https://www.youtube.com/watch?v=GCraGHx6gso&t=2695s

Краткое объяснение

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

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

Примеры использования:

Случай 1: текст x формат

К базовому тексту можно применить несколько форматов совокупно и в любом порядке (полужирный, курсив, подчеркивание, зачеркивание, цвет…).

Случай 2: Пицца x начинки

Пицца состоит из основы, на которую клиент добавляет желаемую начинку. Система рассчитывает цену и формирует заказ в зависимости от начинки, добавленной к пицце.

Действия по реализации

1 - Определите основу

Определите базовый интерфейс, который будет базой для всех объектов, и абстрактную реализацию для базовых объектов (объектов, которые мы хотим украсить).

2 - Определите основу декоратора

Декоратор одновременно ЕСТЬ типа и ИМЕЕТ тип будет украшать.

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

3 - Создайте декораторы

Наследуйте абстрактную базу декораторов, чтобы создать каждый декоратор, который нам нужен.

Теперь мы можем использовать нужный декоратор, комбинируя и накапливая. Затем просто вызовите метод из интерфейса (IText.GetText), и результат будет зависеть от того, какие декораторы были применены.

Мы также можем изолировать логику декорирования, просто получив экземпляр IText и делегируя создание фабрике или другому классу.

Определите ситуацию с шаблоном декоратора

Если во время разработки, проектирования или даже рефакторинга вы обнаружите такие ситуации, возможно, вы можете использовать шаблон Decorator.

1 - Несколько условий для применения различного поведения / функций к объекту (обычно выполняются императивными методами утилиты).

2 - Класс взрыва используется для комбинирования вариаций объекта.

В нашем примере было бы что-то вроде наличия всех этих классов: TextBold, TextItalic, TextUnderline, TextBoldAndItalic, TextBoldAndUnderline, TextBoldAndItalicAndUnderline.

3 - Один или несколько атрибутов, которые во время процесса изменяются цепным или накопительным образом.

4 - объект с логическими флагами, используемый для внесения изменений в сам объект.

Надеюсь, это поможет обнаружить ситуацию с шаблоном проектирования и использовать ее!