Что такое Decorator и чем он отличается от наследования?
Структурные паттерны
Decorator добавляет объекту новое поведение, оборачивая его в объект того же интерфейса: обёртки комбинируются в любом порядке в рантайме, чего наследование дать не может.
Схема
const coffee = new MilkDecorator(new SugarDecorator(new Espresso()));
coffee.cost(); // сумма всех обёрток плюс базаКаждый декоратор реализует интерфейс Beverage, хранит ссылку на обёрнутый объект, добавляет своё и делегирует дальше.
Почему не наследование
Кофе с молоком, с молоком и сахаром, с двойным сахаром — взрывной рост числа подклассов. Декораторы комбинируются в рантайме: n классов дают 2ⁿ вариантов.
Где встречается
- Потоки ввода-вывода:
Buffered(Gzip(File)). - Кеширование, логирование, метрики поверх сервисов.
- Middleware в веб-фреймворках — та же идея вокруг обработчика запроса.
Минусы
Много мелких классов, непростая отладка глубоких стеков обёрток, иногда важен порядок оборачивания.
Коротко для собеседования
Decorator оборачивает объект другим объектом с тем же интерфейсом и добавляет поведение до или после делегирования. Он решает проблему взрыва подклассов при комбинациях возможностей, но за гибкость платишь глубокими стеками обёрток и зависимостью от порядка оборачивания.