Паттерн «Декоратор» Java динамически добавляет объекту поведение во время выполнения или тогда, когда невозможно или нецелесообразно создавать производные классы (возможно, потому, что при этом создаются множественные подклассы).
Пример с пиццерией показывает, как добавить поведение к объекту пиццы во время выполнения на основе сделанного посетителем выбора.
Функциональность интерфейса программирования приложений (API) может быть расширена и усовершенствована посредством оборачивания в декоратор. Подобным образом часто декорируются потоки данных. java.iо.BufferedInputStream — хороший пример декоратора, оборачивающего низкоуровневое API и добавляющего функциональность буферу потока ввода.
В платформе Java ЕЕ декораторы реализованы с помощью контекста и внедрения зависимостей (CDI). Вы можете использовать декораторы для добавления нового бизнес поведения или любой другой функциональности, которая может быть обернута вокруг исходного объекта. Однако подобный проект должен быть хорошо документирован и четко реализован ради удобства сопровождения.
Подключаемость декораторов путем описания в дескрипторе развертывания облегчает активизацию/отключение декораторов без пере-компиляции и повторного развертывания. В среде, где требуется «горячее» развертывание, нет необходимости перезагружать сервер для вступления в силу изменений в bean.xml. Это делает исключительно легким изменение поведения приложения в условиях эксплуатации, без остановки на обслуживание.
Использование квалификаторов в большей степени обеспечивает пошаговый контроль за выполнением декораторов, чем их активизация/отключение в дескрипторе развертывания bean.xml. Вы можете применять квалификаторы для недопущения декорирования отдельных реализаций интерфейса или для добавления различных декораторов к реализациям одного интерфейса.
Кстати, вы создаете сайты на WordPress и Joomla? Мы можем посоветовать качественный проект где сможете скачать шаблоны joomla без скрытого кода и ссылок. Все студии собраны в одном месте, торопитесь!
Декоратор перехватывает обращения только к определенным типам языка jаvа. Он «знает» обо всей семантике данного интерфейса и может реализовывать бизнес логику. Это делает его идеальным для моделирования бизнес-функциональности,отождествляемой с определенным типом интерфейса.
Декораторы часто противопоставляют перехватчикам. Вторые перехватывают вызовы любого типа языка Java, но «не осведомлены» о семантике и поэтому не подходят для моделирования бизнес-функциональности. Перехватчики используются для реализации не связанной с бизнес логикой сквозной функциональности, такой как журналирование, безопасность и аудит.
Интенсивное использование декораторов может привести к ошибкам времени выполнения, более сложному для понимания коду и потере преимущества строго типизированного статического полиморфизма.
Оно также может потребовать дополнительных контрольных примеров. Тем не менее декораторы могут обеспечить практически неограниченные возможности масштабирования приложения и отличный интерфейс для будущих реализаций без нарушения старого кода.