Паттерн "Декоратор" динамически добавляет новое поведение существующему объекту, оборачивая его в другой объект, называемый декоратором.
-
Компоненты:
- Интерфейс (Component): Объявляет общие методы для исходного объекта и его декораторов.
- Конкретный Компонент (Concrete Component): Основной объект, который необходимо декорировать.
- Базовый Декоратор (Decorator): Абстрактный класс или интерфейс, который содержит ссылку на объект интерфейса (Component) и реализует его методы, обычно делегируя вызов этому объекту.
- Конкретные Декораторы (Concrete Decorators): Реализуют новые возможности, дополняя или изменяя поведение базового компонента.
-
Принцип работы:
- Декоратор содержит ссылку на объект, который он декорирует (композиция).
- Декоратор имеет тот же интерфейс, что и декорируемый объект.
- При вызове метода у декоратора, он либо выполняет дополнительную логику до или после вызова соответствующего метода у декорируемого объекта, либо полностью его заменяет (хотя последнее не является типичным использованием).
-
Преимущества:
- Позволяет добавлять функциональность к объектам во время выполнения, а не в статическом виде наследования.
- Избегает "взрыва" иерархии классов при комбинировании множества различных поведений.
- Позволяет создавать гибкие комбинации поведения.
-
Пример:
php