Как устроен декоратор
Декоратор — это структурный паттерн проектирования, который позволяет добавлять объектам новые обязанности динамически, оборачивая их в полезные "обёртки". В отличие от наследования, декораторы предлагают гибкий способ расширять функциональность объекта, не изменяя его исходный код или поведение других объектов того же класса. Полезны для соблюдения принципа открытости/закрытости, одного из пяти основных принципов SOLID в объектно-ориентированном дизайне.
Структура
Декоратор обычно состоит из следующих компонентов:
1. Компонент (Component): Определяет интерфейс для объектов, которым могут быть добавлены дополнительные обязанности динамически.
2. Конкретный Компонент (Concrete Component): Определяет объект, к которому дополнительные обязанности могут быть добавлены.
3. Декоратор (Decorator): Содержит компонент, к которому нужно добавить новые обязанности. Имеет тот же базовый интерфейс, что и компоненты, которые он декорирует, что позволяет использовать декорированные объекты так же, как и оригинальные.
4. Конкретные Декораторы (Concrete Decorators): Добавляют новые обязанности к компоненту, которые находятся внутри.
Принцип работы
1. Оборачивание: Декоратор "оборачивает" или "декорирует" компонент, предоставляя тем самым расширенный интерфейс с дополнительными обязанностями. Клиентский код, использующий декоратор, работает с расширенным интерфейсом, не зная о наличии декорации.
2. Делегирование: Декоратор делегирует работу обёрнутому компоненту, а затем добавляет свою логику до или после вызова основного компонента. Это позволяет выполнять дополнительные действия до или после основного поведения компонента.
3. Композиция вместо наследования: Вместо использования наследования для расширения поведения объекта, декораторы применяют композицию — объект декоратор содержит другой объект компонента и расширяет его функциональность.
Пример
Декораторы часто используются для модификации функций и методов. Пример ниже показывает, как декоратор может добавлять функциональность к функции:
```php
def my_decorator(func):
def wrapper():
print("Что-то происходит до вызова функции.")
func()
print("Что-то происходит после вызова функции.")
return wrapper
@my_decorator
def say_hello():
print("Привет!")
say_hello()
```В этом примере, `my_decorator` является декоратором, который добавляет строки вывода до и после выполнения функции `say_hello`. Декораторы используют синтаксис `@`, который предшествует имени функции, которую нужно декорировать.
Декораторы предоставляют мощный инструмент для расширения и модификации поведения объектов и функций, поддерживая чистоту исходного кода и облегчая поддержку и расширение функциональности.
April 7, 2024, easyoffer
