PassFront
  1. PassFront
  2. База знаний
  3. Структурные паттерны

Что такое Decorator и чем он отличается от наследования?

Структурные паттерны

Decorator добавляет объекту новое поведение, оборачивая его в объект того же интерфейса: обёртки комбинируются в любом порядке в рантайме, чего наследование дать не может.

Схема

const coffee = new MilkDecorator(new SugarDecorator(new Espresso()));
coffee.cost(); // сумма всех обёрток плюс база

Каждый декоратор реализует интерфейс Beverage, хранит ссылку на обёрнутый объект, добавляет своё и делегирует дальше.

Почему не наследование

Кофе с молоком, с молоком и сахаром, с двойным сахаром — взрывной рост числа подклассов. Декораторы комбинируются в рантайме: n классов дают 2ⁿ вариантов.

Где встречается

  • Потоки ввода-вывода: Buffered(Gzip(File)).
  • Кеширование, логирование, метрики поверх сервисов.
  • Middleware в веб-фреймворках — та же идея вокруг обработчика запроса.

Минусы

Много мелких классов, непростая отладка глубоких стеков обёрток, иногда важен порядок оборачивания.

Коротко для собеседования

Decorator оборачивает объект другим объектом с тем же интерфейсом и добавляет поведение до или после делегирования. Он решает проблему взрыва подклассов при комбинациях возможностей, но за гибкость платишь глубокими стеками обёрток и зависимостью от порядка оборачивания.

Другие вопросы раздела