比较常用咯~~
- 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!')
来源: http://www.bubuko.com/infodetail-3034368.html