Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
Это старая версия документа!
## Декоратор (Decorator)
[▶ code](http://webmastermsk.ru:30000/serg/patterns-php/-/blob/main/structural/Decorator.php)
> Шаблон декоратора позволяет динамически изменять поведение объекта во время выполнения, заключая его в объект класса
декоратора.
Возможность динамически добавлять новые обязанности, не прибегая к порождению подклассов, облегчает понимание основных
обязанностей объектов и не запутывает основную бизнес-логику информационных систем.
Можно добавлять и удалять обязанности во время выполнения программы, в то время как при использовании наследования надо
было бы создавать новый класс для каждой дополнительной обязанности.
Данный шаблон позволяет не создавать классов, перегруженных методами. Новые обязанности можно добавлять только по мере
необходимости, не перегружая программное обеспечение лишними классами.
**Использование:**
- Когда вам нужно добавлять обязанности объектам на лету, незаметно для кода, который их использует.
- Объекты помещают в обёртки, имеющие дополнительные поведения. Обёртки и сами объекты имеют одинаковый интерфейс,
поэтому клиентам без разницы, с чем работать – с обычным объектом данных или с обёрнутым.
- Когда нельзя расширить обязанности объекта с помощью наследования.
- Во многих языках программирования есть ключевое слово final, которое может заблокировать наследование класса.
Расширить такие классы можно только с помощью Декоратора.
**Преимущества:**
- Большая гибкость, чем у наследования.
- Позволяет добавлять обязанности на лету.
- Можно добавлять несколько новых обязанностей сразу.
- Позволяет иметь несколько мелких объектов вместо одного объекта на все случаи жизни.
**Недостатки:**
- Трудно конфигурировать многократно обёрнутые объекты.
- Обилие крошечных классов.
<details>
<summary><strong>Связи с другими паттернами</strong></summary>
<br>
Адаптер меняет интерфейс существующего объекта. Декоратор улучшает другой объект без изменения его интерфейса. Причём
Декоратор поддерживает рекурсивную вложенность, чего не скажешь об Адаптере.<br>
<br>
Адаптер предоставляет классу альтернативный интерфейс. Декоратор предоставляет расширенный интерфейс. Заместитель
предоставляет тот же интерфейс.<br>
<br>
Цепочка обязанностей и Декоратор имеют очень похожие структуры. Оба паттерна базируются на принципе рекурсивного
выполнения операции через серию связанных объектов. Но есть и несколько важных отличий.<br>
<br>
Обработчики в Цепочке обязанностей могут выполнять произвольные действия, независимые друг от друга, а также в любой
момент прерывать дальнейшую передачу по цепочке. С другой стороны Декораторы расширяют какое-то определённое действие,
не ломая интерфейс базовой операции и не прерывая выполнение остальных декораторов.<br>
<br>
Компоновщик и Декоратор имеют похожие структуры классов из-за того, что оба построены на рекурсивной вложенности. Она
позволяет связать в одну структуру бесконечное количество объектов.<br>
<br>
Декоратор оборачивает только один объект, а узел Компоновщика может иметь много детей. Декоратор добавляет вложенному
объекту новую функциональность, а Компоновщик не добавляет ничего нового, но «суммирует» результаты всех своих детей.<br>
<br>
Но они могут и сотрудничать: Компоновщик может использовать Декоратор, чтобы переопределить функции отдельных частей
дерева компонентов.<br>
<br>
Архитектура, построенная на Компоновщиках и Декораторах, часто может быть улучшена за счёт внедрения Прототипа. Он
позволяет клонировать сложные структуры объектов, а не собирать их заново.<br>
<br>
Стратегия меняет поведение объекта «изнутри», а Декоратор изменяет его «снаружи».<br>
<br>
Декоратор и Заместитель имеют схожие структуры, но разные назначения. Они похожи тем, что оба построены на принципе
композиции и делегируют работу другим объектам. Паттерны отличаются тем, что Заместитель сам управляет жизнью сервисного
объекта, а обёртывание Декораторов контролируется клиентом.<br>
<br>
</details>