Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять новое поведение к объектам, оборачивая их в специальные объекты-декораторы.
Основные принципы:
Преимущества:
Недостатки:
Пример (Java):
Допустим, у нас есть интерфейс Coffee и его реализация SimpleCoffee. Мы хотим добавить к кофе молоко и сахар. Вместо создания классов типа MilkCoffee, SugarCoffee, MilkSugarCoffee, мы используем декораторы.
java
Сравнение с наследованием:
| Особенность | Наследование | Декоратор |
|---|---|---|
| Добавление поведения | Статическое (на этапе компиляции) | Динамическое (во время выполнения) |
| Гибкость | Ограниченная (проблема разрастания иерархии) | Высокая (через комбинирование) |
| Повторное использование | Возможно через наследование | Легко (один декоратор для разных объектов) |
Применяется, когда нужно добавить ответственность к объектам, не изменяя их код и не создавая множество подклассов. Хорошим примером в самой Java является чтение/запись данных с использованием декораторов на потоках ввода-вывода (например, BufferedReader, BufferedWriter оборачивают базовые потоки).