Встречается на собеседованиях • сегодня

Как устроен декоратор

Декоратор — это структурный паттерн проектирования, который позволяет добавлять объектам новые обязанности динамически, оборачивая их в полезные "обёртки". В отличие от наследования, декораторы предлагают гибкий способ расширять функциональность объекта, не изменяя его исходный код или поведение других объектов того же класса. Полезны для соблюдения принципа открытости/закрытости, одного из пяти основных принципов SOLID в объектно-ориентированном дизайне.

Структура
Декоратор обычно состоит из следующих компонентов:

1. Компонент (Component): Определяет интерфейс для объектов, которым могут быть добавлены дополнительные обязанности динамически.

2. Конкретный Компонент (Concrete Component): Определяет объект, к которому дополнительные обязанности могут быть добавлены.

3. Декоратор (Decorator): Содержит компонент, к которому нужно добавить новые обязанности. Имеет тот же базовый интерфейс, что и компоненты, которые он декорирует, что позволяет использовать декорированные объекты так же, как и оригинальные.

4. Конкретные Декораторы (Concrete Decorators): Добавляют новые обязанности к компоненту, которые находятся внутри.

Принцип работы
1. Оборачивание: Декоратор "оборачивает" или "декорирует" компонент, предоставляя тем самым расширенный интерфейс с дополнительными обязанностями. Клиентский код, использующий декоратор, работает с расширенным интерфейсом, не зная о наличии декорации.

2. Делегирование: Декоратор делегирует работу обёрнутому компоненту, а затем добавляет свою логику до или после вызова основного компонента. Это позволяет выполнять дополнительные действия до или после основного поведения компонента.

3. Композиция вместо наследования: Вместо использования наследования для расширения поведения объекта, декораторы применяют композицию — объект декоратор содержит другой объект компонента и расширяет его функциональность.

Пример
Декораторы часто используются для модификации функций и методов. Пример ниже показывает, как декоратор может добавлять функциональность к функции:

text
```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

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы