Шаблон декоратора - когда использовать (определить ситуацию с шаблоном)
Цель этой статьи с практическими рекомендациями - показать, как определить возможность использования шаблона декоратора.
Если вы новичок в этом шаблоне проектирования, я рекомендую видео Кристофера Охрави, в котором он очень хорошо объясняется: 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 - объект с логическими флагами, используемый для внесения изменений в сам объект.
Надеюсь, это поможет обнаружить ситуацию с шаблоном проектирования и использовать ее!