Рубрики
Без рубрики

Узор наблюдателя

На прошлой неделе мы узнали о стратегическом узоре, сегодня мы увидим о шаблоне наблюдателя. О … Теги с DesignPattern, ObserverPattern, Python.

Шаблоны дизайна (2 части серии)

На прошлой неделе мы узнали о стратегическом узоре, сегодня мы увидим о шаблоне наблюдателя.

Узор наблюдателя – это шаблон поведенческой конструкции, в которой объект может иметь несколько иждивенцев (можно назвать наблюдателями), которые будут получать уведомления при изменении состояния объекта.

Некоторые термины, которые нам нужно знать,

  • Наблюдатель – иждивенцев, которые должны быть уведомлены
  • Наблюдаемый – объект, который уведомляет своих наблюдателей

Реальный пример этой картины – это служба подписки для журнала. Допустим, мы подписываемся на журнал. Здесь журнальная компания – это объект, у них будет список иждивенцев (люди, которые подписаны на их журнал). Всякий раз, когда публикуется новый журнал, он будет отправлен всем подписчикам.

Некоторые из технических примеров шаблона наблюдателя

  • Модель просмотра шаблона контроллера (здесь просмотр представляет Наблюдатель и модель представляет Наблюдаемый Несомненно
  • LiveData в андроиде
  • В социальных сетях платформы, такие как Facebook/Twitter, человек может опубликовать или обновить его статус, и их последователи получат уведомление.

Давайте посмотрим, как мы можем реализовать этот шаблон в Python

class Subject(object):
    def __init__(self):
        self.observers = []

    def subscribe(self, observer):
        self.observers.append(observer)

    def unsubscribe(self, observer):
        self.observers.remove(observer)

    def notify(self, *args, **kwargs):
        for observer in self.observers:
            observer.notify(*args, **kwargs)

class EmailSender(Subject):
    pass

В приведенном выше коде у нас есть Тема У кого есть методы для подписки/отписывающих наблюдателей. Кроме того, у нас есть метод под названием уведомлять Всякий раз, когда пользователь хочет отправить электронные письма своим подписчикам, он может позвонить в этот метод.

Обратите внимание, что мы написали общий код для шаблона наблюдателя в отдельном классе под названием Тема Отказ Это для повторного использования и для более чистого кода.

class EmailObserver(object):
    def __init__(self, email):
        self.to_address = email

    def notify(self):
        self.send_email()

    def send_email(self):
        print(f"Sending email to {self.to_address}")

if __name__ == '__main__':
    email_sender = EmailSender()
    subscriber1 = EmailObserver("abc@gmail.com")
    subscriber2 = EmailObserver("efg@gmail.com")

    email_sender.subscribe(subscriber1)
    email_sender.subscribe(subscriber2)
    email_sender.notify()

    print("Unsubscribing subscriber1")
    email_sender.unsubscribe(subscriber1)
    email_sender.notify()

В приведенном выше коде мы определили Наблюдатель и подписался на это на EmailSender.

Приведенный выше код выводит следующее

Sending email to abc@gmail.com
Sending email to efg@gmail.com
Unsubscribing subscriber1
Sending email to efg@gmail.com

Шаблоны дизайна (2 части серии)

Оригинал: “https://dev.to/codewithkarthik/observer-pattern-57cf”