Шаблоны дизайна (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”