Decorator — динамическое расширение поведения объектов
Decorator позволяет добавлять новые функции объекту без изменения его класса. Объект «оборачивается» цепочкой декораторов, каждый из которых добавляет свою логику.
Паттерн особенно полезен, когда невозможно или нежелательно менять исходный код, а также когда нужно комбинировать разные аспекты поведения динамически.
Decorator широко применяется в логировании, шифровании, кэшировании, валидации, контроле доступа, сетевой обработке и middleware.
Decorator — это один из базовых способов расширения поведения объекта без наследования и без изменения исходного класса. Архитектура современных приложений насыщена декораторами, от backend до frontend, от сетевых библиотек до UI-компонентов.
Главная идея Decorator
Decorator использует композицию:
объект «оборачивается» другим объектом, имеющим тот же интерфейс.
Каждый декоратор:
-
принимает объект;
-
добавляет свое поведение до или после вызова метода;
-
передаёт управление дальше.
В итоге создается цепочка из модифицирующих слоев.
Где используется Decorator
Decorator кажется простым, но он фундаментален для огромного количества технологий.
1. Логирование и аудит
Когда нужно добавить запись в лог:
-
до вызова метода;
-
после вызова;
-
при ошибке.
Например:
scssLoggerDecorator(OrderService)
2. Кэширование результатов
Можно добавить слой кэша:
scssCachedUserRepository(UserRepository)
Реальный репозиторий вызывает базу данных, а декоратор проверяет кэш.
3. Безопасность и контроль доступа
Декораторы проверяют:
-
авторизацию;
-
роли;
-
токены;
-
ограничения.
scssSecureServiceDecorator(Service)
4. Валидация входных данных
Обычно сервис делает бизнес-логику
Декоратор — входную валидацию.
5. Транзакции, ретраи, circuit breaker
В многослойных архитектурах resilience-паттерны реализуются через декораторы:
-
RetryDecorator
-
CircuitBreakerDecorator
-
TimeoutDecorator
Это классическая реализация resilient chain.
6. Middleware в веб-фреймворках
Большинство веб-фреймворков используют Decorator как основу:
-
Express.js middleware
-
FastAPI dependencies
-
ASP.NET Middleware
-
Django Middleware
-
Spring Interceptors
Каждая «прослойка» — это декоратор, добавляющий поведение к запросу/ответу.
7. UI-компоненты и стилизация
Например:
-
оборачиваем компонент логированием;
-
добавляем правый блок;
-
добавляем тему;
-
добавляем анимацию.
React HOC (High-Order Components) — это по сути Decorator.
Преимущества Decorator
-
динамическое добавление поведения;
-
не требует изменения исходного класса;
-
можно комбинировать функции;
-
позволяет строить цепочки аспектов;
-
увеличивает гибкость архитектуры.
Недостатки
-
может создать очень длинные цепочки;
-
сложно отлаживать, если слишком много слоев;
-
нарушает читаемость при неправильном использовании;
-
легко превратиться в «архитектурный спагетти», если нет контроля.
Архитектор должен задавать стандарты оформления цепочек декораторов.
Decorator в российских учебниках
Decorator описывается в темах:
-
расширение функциональности системы;
-
объектно-ориентированное проектирование;
-
middleware и адаптеры;
-
уровни обработки запросов;
-
безопасности и логирования.
Особенно активно приводятся примеры оформления поведения в корпоративных приложениях.
Почему архитектор обязан знать Decorator
Потому что без Decorator невозможно построить:
-
middleware-цепочки;
-
архитектуру микросервисов;
-
адаптеры;
-
API gateway фильтры;
-
инъекцию функциональных аспектов;
-
механизмы безопасности;
-
resilient-инфраструктуру.
Decorator фактически является основой современной программной инженерии.