Паттерн "Декоратор" (Decorator) в Java — расширение поведения без наследования
Модель и масштаб — Основы БД, опорные темы, проектирование БД, пакетная работа. Карта — о разделе.
Обзор — в структурных паттернах. Здесь — практический 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
| Decorator | Proxy | |
|---|---|---|
| Назначение | Расширение поведения | Контроль доступа и жизненного цикла |
| Фокус | Дополнительные возможности | Проверка прав, lazy, удаленный вызов |
Практика Proxy на Java — Паттерн "Заместитель" (Proxy) в Java — доступ, кэш и lazy loading.
Риски
Много мелких классов и сложный стек оберток в отладке. Держите прозрачные имена (CachingDecorator, MetricsDecorator) и фиксируйте порядок в конфигурации.