Паттерн Декоратор (или Обертка) - структурный.
- Позволяет добавлять новое поведение до, после и даже вместо исходного поведения объекту без изменения его кода.
- Можно вложенно декорировать (цепочкой)
Tip
Допустим, есть базовый класс с функцией отправки сообщения.
И мы хотим добавлять логирование и шифрование без изменения оригинального класса.
Декоратор будет наследоваться от базового класса отправки сообщения и переопределять его метод отправки сообщения так, чтобы внутри вызывать оригинальную (родительскую) эту же функцию.
from abc import ABC, abstractmethod
class Notifier(ABC):
@abstractmethod
def send(self, message):
pass
class BasicNotifier(Notifier):
def send(self, message):
print(f'Отправка сообщения: "{message}"')
class NotifierDecorator(Notifier):
def __init__(self, wrapped: Notifier):
self.wrapped = wrapped
def send(self, message):
self.wrapped.send(message)
class LoggingDecorator(NotifierDecorator):
def send(self, message):
print("[ЛОГ] Подготовка к отправке")
super().send(message)
print("[ЛОГ] Отправка завершена")
class EncryptionDecorator(NotifierDecorator):
def send(self, message):
encrypted = "".join(reversed(message))
print("[ШИФР] Сообщение зашифровано")
super().send(encrypted)
notifier = BasicNotifier()
notifier = LoggingDecorator(notifier)
notifier = EncryptionDecorator(notifier)
notifier.send("Привет, мир!")
# output:
# [ШИФР] Сообщение зашифровано
# [ЛОГ] Подготовка к отправке
# Отправка сообщения: "!рим ,тевирП"
# [ЛОГ] Отправка завершена