Можешь привести пример применения паттерна декоратор в коде?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Паттерн декоратор нужен, чтобы динамически добавлять объекту новое поведение без изменения его класса. Обычно это делается через обёртку: базовый объект остаётся тем же, а дополнительные возможности подключаются снаружи. В Python это особенно удобно для расширения логики по шагам.
Определение:
Декоратор — это структурный паттерн, который позволяет «обернуть» объект другим объектом с тем же интерфейсом и добавить ему новое поведение. Вместо наследования используется композиция: объект передаётся в обёртку, а вызовы делегируются внутрь с добавлением нужной логики.
Пример использования:
Допустим, есть отправка уведомлений, и к базовой отправке нужно добавить логирование и шифрование без изменения основного класса.
from abc import ABC, abstractmethod
class Notifier(ABC):
@abstractmethod
def send(self, message: str) -> str:
pass
class EmailNotifier(Notifier):
def send(self, message: str) -> str:
return f"Отправлено по email: {message}"
class NotifierDecorator(Notifier):
def __init__(self, notifier: Notifier):
self._notifier = notifier
def send(self, message: str) -> str:
return self._notifier.send(message)
class LoggingDecorator(NotifierDecorator):
def send(self, message: str) -> str:
print(f"[LOG] Отправка сообщения: {message}")
return super().send(message)
class EncryptionDecorator(NotifierDecorator):
def send(self, message: str) -> str:
encrypted = f"encrypted({message})"
return super().send(encrypted)
notifier = LoggingDecorator(EncryptionDecorator(EmailNotifier()))
result = notifier.send("Привет!")
print(result)
Пояснение кода:
Notifierзадаёт общий интерфейс с методомsend.EmailNotifier— базовая реализация, которая просто отправляет сообщение.NotifierDecoratorхранит ссылку на другойNotifierи делегирует ему вызовsend.LoggingDecoratorдобавляет логирование перед основной отправкой.EncryptionDecoratorизменяет сообщение, а затем передаёт дальше по цепочке.- В
notifier = LoggingDecorator(EncryptionDecorator(EmailNotifier()))декораторы складываются друг в друга, поэтому поведение наращивается поэтапно.
Ключевые моменты:
- Декоратор добавляет поведение без изменения исходного класса.
- Основа паттерна — одинаковый интерфейс у объекта и у обёртки.
- Можно комбинировать несколько декораторов в цепочку.
- Это гибче наследования, когда расширений много и они могут сочетаться.
- В Python паттерн удобно реализуется через композицию объектов, а не через глубокую иерархию классов.