Decorator (Декоратор): расширение поведения без наследования
Decorator позволяет добавлять объекту новое поведение динамически, не изменяя его код и не создавая громоздкие иерархии наследования. Объект «оборачивается» в декораторы, каждый из которых добавляет новые функции.
Паттерн идеально подходит для построения middleware, цепочек обработки запросов, логирования, кэширования, проверки прав, ретраев и трансформаций данных.
Decorator делает архитектуру открытой для расширений, упрощает поддержку и позволяет гибко подключать функциональность во время выполнения.
Decorator решает фундаментальную проблему архитектуры: как расширять поведение объекта, не изменяя его кода, не лезя внутрь и не нарушая инварианты. Это особенно важно в системах, где:
-
требуется гибкое добавление функциональности;
-
нужна модульность;
-
изменения делаются редко, но требуют строгого контроля;
-
система должна поддерживать плагины, middleware и цепочки обработки.
Decorator основан на композиции: новый объект содержит оригинал и делегирует ему часть поведения, добавляя или изменяя остальное.
Главная идея Decorator
Есть базовый интерфейс:
cssComponent: operation()
И есть реальный объект:
nginxConcreteComponent
Декоратор реализует тот же интерфейс, но содержит внутри базовый объект:
makefileDecorator: has Component inside
Каждый декоратор переопределяет операцию, добавляя своё поведение:
-
до вызова базового метода;
-
после вызова;
-
вместо него;
-
комбинируя несколько действий.
Декораторы можно «сцеплять»:
lessLogDecorator( AuthDecorator( CacheDecorator( Service ) ) )
Это фундаментальная идея middleware.
Где используется Decorator в современной архитектуре
1. Middleware во всех веб-фреймворках
Каждый HTTP-фреймворк в мире использует Декоратор:
-
Express.js
-
ASP.NET Core
-
Spring WebFlux
-
FastAPI
-
Django Middleware
-
Laravel Middleware
Каждый middleware — это декоратор над запросом.
2. Логирование, мониторинг, метрики
Декораторы добавляют:
-
логирование вызовов;
-
метрики;
-
измерение времени;
-
детектирование ошибок;
-
распределенный трейсинг.
Так строятся observability-системы.
3. Кэширование
Decorator позволяет добавить:
-
кэширование результата;
-
инвалидацию;
-
warm-up кэша.
И всё это без изменения исходного сервиса.
4. Авторизация и аутентификация
Например:
nginxAuthDecorator → проверяет пользователя PermissionDecorator → проверяет роли ValidationDecorator → проверяет входные данные
Все они — декораторы.
5. API Gateway / Reverse Proxy
В API Gateway цепочки фильтров — это по сути декораторы:
-
rate limiting
-
circuit breaker
-
throttling
-
rewrite headers
-
security filters
Это Decorator на уровне сетевого стека.
6. Обработка команд и событий
В CQRS/EDA:
-
Saga decorators
-
Validation decorators
-
Retry decorators
-
Audit decorators
-
Transaction decorators
Каждый обработчик команд состоит из «слоев» декораторов.
7. Шифрование / компрессия
Например:
-
OutputStream → GZipStream → EncryptingStream → LoggingStream
Это классический Decorator в Java и .NET.
Преимущества Decorator
-
динамическое расширение поведения;
-
отсутствие необходимости менять существующий код;
-
композиция вместо наследования;
-
можно подключать функциональность по мере необходимости;
-
упрощает тестирование (можно выключить/включить слои);
-
идеально подходит для middleware и плагинов.
Недостатки
-
много мелких классов;
-
трудно «разбираться» в длинной цепочке слоёв;
-
сложно дебажить, если декораторов много;
-
требует аккуратного проектирования порядка применения.
Но архитектурно — это один из самых мощных и гибких инструментов.
Decorator в российских учебниках
Особенно подчёркивается его применение в:
-
middleware;
-
потоковой обработке данных;
-
сетевых протоколах;
-
логистике процессов;
-
файловых системах;
-
IoC-контейнерах.
Decorator — обязательная часть курса "Архитектура ИС".
Почему архитектор обязан знать Decorator
Потому что:
-
90% современных архитектур используют middleware;
-
каждый API Gateway — это цепочка декораторов;
-
Observability строится на декораторах;
-
CQRS/EDA используют декораторы;
-
авторизация, логирование, кеш, retry — это декораторы;
-
микросервисы строятся слоями обёрток.
Decorator = универсальный механизм расширения поведения без изменения ядра.
Это один из самых полезных паттернов для архитектора.