比较常用咯~~
from django.test import TestCase from abc import ABCMeta, abstractmethod # 行为型设计模式---观察者模式 class Subject: def __init__(self): self._observers = [] def register(self, observer): self._observers.append(observer) def notify_all(self, *args, **kwargs): for observer in self._observers: observer.notify(self, *args, **kwargs) class ObserverA: def __init__(self, subject): subject.register(self) def notify(self, subject, *args): print(type(self).__name__, ':: Got ', args, ' From ', subject) class ObserverB: def __init__(self, subject): subject.register(self) def notify(self, subject, *args): print(type(self).__name__, ':: Got ', args, ' From ', subject) subject = Subject() ob1 = ObserverA(subject) ob2 = ObserverB(subject) subject.notify_all('notification') class NewsPublisher: def __init__(self): self._subscribers = [] self._latest_news = None def attach(self, subscriber): self._subscribers.append(subscriber) def detach(self): return self._subscribers.pop() def subscribers(self): return [type(x).__name__ for x in self._subscribers] def notify_subscribers(self): for sub in self._subscribers: sub.update() def add_news(self, news): self._latest_news = news def get_news(self): return 'Got News: ', self._latest_news class Subscriber(metaclass=ABCMeta): @abstractmethod def update(self): pass class SMSSubscriber: def __init__(self, publisher): self.publisher = publisher self.publisher.attach(self) def update(self): print(type(self).__name__, self.publisher.get_news()) class EmailSubscriber: def __init__(self, publisher): self.publisher = publisher self.publisher.attach(self) def update(self): print(type(self).__name__, self.publisher.get_news()) class AnyOtherSubscriber: def __init__(self, publisher): self.publisher = publisher self.publisher.attach(self) def update(self): print(type(self).__name__, self.publisher.get_news()) news_publisher = NewsPublisher() for Subscribers in [SMSSubscriber, EmailSubscriber, AnyOtherSubscriber]: Subscribers(news_publisher) print('Subscribers: ', news_publisher.subscribers()) news_publisher.add_news('Hello, world!') news_publisher.notify_subscribers() print('Detached: ', type(news_publisher.detach()).__name__) print('Subscribers: ', news_publisher.subscribers()) news_publisher.add_news('My second news!') news_publisher.notify_subscribers()
ObserverA :: Got ('notification',) From <__main__.Subject object at 0x0000000002A2BF28> ObserverB :: Got ('notification',) From <__main__.Subject object at 0x0000000002A2BF28> Subscribers: ['SMSSubscriber', 'EmailSubscriber', 'AnyOtherSubscriber'] SMSSubscriber ('Got News: ', 'Hello, world!') EmailSubscriber ('Got News: ', 'Hello, world!') AnyOtherSubscriber ('Got News: ', 'Hello, world!') Detached: AnyOtherSubscriber Subscribers: ['SMSSubscriber', 'EmailSubscriber'] SMSSubscriber ('Got News: ', 'My second news!') EmailSubscriber ('Got News: ', 'My second news!')