Декоратор
Decorator
Назначение
Паттерн декоратор (Decorator) позволяет динамически добавлять новые обязанности объекту. Декораторы являются гибкой альтернативой порождению подклассов для расширения функциональности.
Рекурсивно декорирует основной объект.
Предполагает возможность применять несколько декораторов последовательно, оборачивая один декоратор в другой. Каждый декоратор добавляет свою функциональность к объекту, а затем передает управление следующему декоратору в цепочке, пока не достигнет последнего.
Паттерн декоратор использует схему "обертываем подарок, кладем его в коробку, обертываем коробку".
Решаемые задачи
динамическое, прозрачное для клиентов добавление обязанностей объектам
реализация обязанностей, которые могут быть сняты с объекта
применяется, когда расширение путем наследования по каким-то причинам неудобно или невозможно
UML диаграмма

Преимущества
Гибкость: возможность добавлять желаемую реализацию к любому классу. Появлется возможность "декорировать" декораторы.
Отсутсвие разрастания иерархии.
Позволяет избежать перегруженных функциями классов на верхних уровнях иерархии.
Возможность обращаться с декорированным объектом так же как и с исходной сущностью.
Отсутствие дублирования кода, данный код просто уходит в конкретный декоратор.
Недостатки
Снижение производительности программы.
Не используя декораторы можно напрямую пользоваться методом класса. Декоратор же может долго полиморфно совершать цепочку вызовов, что сказывается на времени выполнения программы.
Вся ответственность за декорирование "ложится на плечи" программиста
Нет сущности, которая бы полностью отвечала за последовательность декорирования: за порядок вызова и оборачивания декораторов
В случае если в цепочке вызовов декоратора появляется необходимость изменить какую-либо обертку или удалить ее, то приходится заново оборачивать исходный объект.
Необходимость в создании сущности, отвечающей за декорирование.
Связь с другими паттернами
Компоновщик: декоратор можно рассматривать как вырожденный случай компоновщика с единственным компонентом. Однако Decorator добавляет новые обязанности и не предназначен для агрегирования объектов.
Стратегия: декоратор хорошо совмещается с паттерном стратегия. Декоратор позволяет изменить внешний облик объекта, стратегия – его внутреннее содержание. Это два взаимодополняющих способа изменения объекта.
Адаптер: если декоратор изменяет только обязанности объекта, но не его интерфейс, то адаптер придает объекту совершенно новый интерфейс.
Last updated
Was this helpful?