Перейти к основному содержимому

Паттерн "Декоратор" (Decorator) в Java — расширение поведения без наследования

Разработчику Архитектору
Теория данных (раздел 3)

Обзор — в структурных паттернах. Здесь — практический Decorator на Java через слой логирования и слой кеша.

Play ITЗагрузка интерактивного демо…


Задача паттерна

Decorator добавляет поведение объекту в runtime без изменения его класса.

Идея простая: объект оборачивается в другой объект с тем же интерфейсом. Каждый слой может добавить логику до/после делегирования.


Пример — сервис данных

Код ITЗагрузка примера кода…

DataService service = new CachingDecorator(
new LoggingDecorator(
new DatabaseService()
)
);

service.getData("user:42"); // лог + БД + кеш
service.getData("user:42"); // кеш

Когда использовать

СигналПочему Decorator
Комбинации поведения заранее неизвестныСлои добавляются и переставляются
Нежелательно раздувать иерархию наследованияИзбегаем ServiceWithLogAndCacheAndMetrics
Нужно расширять в runtimeНовая обертка подключается конфигурацией

В JDK тот же принцип в I/O: InputStream -> BufferedInputStream -> GZIPInputStream.


Decorator и Proxy

DecoratorProxy
НазначениеРасширение поведенияКонтроль доступа и жизненного цикла
ФокусДополнительные возможностиПроверка прав, lazy, удаленный вызов

Практика Proxy на Java — Паттерн "Заместитель" (Proxy) в Java — доступ, кэш и lazy loading.


Риски

Много мелких классов и сложный стек оберток в отладке. Держите прозрачные имена (CachingDecorator, MetricsDecorator) и фиксируйте порядок в конфигурации.


См. также