Skip to content

Latest commit

 

History

History
63 lines (44 loc) · 2.26 KB

File metadata and controls

63 lines (44 loc) · 2.26 KB

Паттерн Декоратор

Паттерн Декоратор (или Обертка) - структурный.

  • Позволяет добавлять новое поведение до, после и даже вместо исходного поведения объекту без изменения его кода.
  • Можно вложенно декорировать (цепочкой)

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:
# [ШИФР] Сообщение зашифровано
# [ЛОГ] Подготовка к отправке
# Отправка сообщения: "!рим ,тевирП"
# [ЛОГ] Отправка завершена