class Subject:
def __init__(self):
self.__observers = []
def register(self, observer):
self.__observers.append(observer)
def notifyAll(self, *args, **kwargs):
for observer in self.__observers:
observer.notify(self, *args, **kwargs)
class Observer1:
def __init__(self, subject):
subject.register(self)
def notify(self, subject, *args):
print(type(self).__name__, '::Got', args, 'From', subject)
class Observer2:
def __init__(self, subject):
subject.register(self)
def notify(self, subject, *args):
print(type(self).__name__, "::Got", args, 'From', subject)
subject = Subject()
observer1 = Observer1(subject)
observer2 = Observer2(subject)
subject.notifyAll('notification!!! ')
뉴스 에이전시를 옵서버 패턴으로 구현해보자, 뉴스 에이전시는 일반적으로 여러 곳에서 뉴스를 모아 구독자에게 전달한다.
class NewsPublisher:
def __init__(self):
self.__subscribers = []
self.__latestNews = None
def attach(self, subscriber):
self.__subscribers.append(subscriber)
def detach(self):
self.__subscribers.pop()
def subscribers(self):
return [type(x).__name__ for x in self.__subscribers]
def notifySubscribers(self):
for sub in self.__subscribers:
sub.update()
def addNews(self, news):
self.__latestNews = news
def getNews(self):
return "Got News", self.__latestNews
from abc import ABCMeta, abstractmethod
class Subscriber(metaclass=ABCMeta):
@abstractmethod
def update(self):
pass
class SMSSubscriber(Subscriber):
def __init__(self, publisher):
self.publisher = publisher
self.publisher.attach(self)
def update(self):
print(type(self).__name__, self.publisher.getNews())
class EmailSubscriber(Subscriber):
def __init__(self, publisher):
self.publisher = publisher
self.publisher.attach(self)
def update(self):
print(type(self).__name__, self.publisher.getNews())
if __name__ == '__main__':
news_publisher = NewsPublisher()
for subscriber in [SMSSubscriber, EmailSubscriber]:
subscriber(news_publisher)
news_publisher.addNews('new News!! he is gone')
news_publisher.notifySubscribers()
news_publisher.addNews('new News!! second!!')
news_publisher.notifySubscribers()
SMSSubscriber ('Got News', 'new News!! he is gone')
EmailSubscriber ('Got News', 'new News!! he is gone')
SMSSubscriber ('Got News', 'new News!! second!!')
EmailSubscriber ('Got News', 'new News!! second!!')