abc ABCMeta,abstractmethod
<span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class
<span class="hljs-title" style="color: #7285b7;">NewsPublisher: <span class="hljs-comment" style="color: #7285b7;">#subject
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def <span class="hljs-title" style="color: #7285b7;">init<span class="hljs-params" style="color: #ffc58f;">(self):
self.subscribers = []
self.latestNews = <span class="hljs-keyword" style="color: #ebbbff;">None
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">attach</span><span class="hljs-params" style="color: #ffc58f;">(self,subscriber)</span>:</span>
self.__subscribers.append(subscriber)
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">detach</span><span class="hljs-params" style="color: #ffc58f;">(self)</span>:</span>
<span class="hljs-keyword" style="color: #ebbbff;">return</span> self.__subscribers.pop()
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">notifySubscribers</span><span class="hljs-params" style="color: #ffc58f;">(self)</span>:</span>
<span class="hljs-keyword" style="color: #ebbbff;">for</span> sub <span class="hljs-keyword" style="color: #ebbbff;">in</span> self.__subscribers:
sub.update()
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">addNews</span><span class="hljs-params" style="color: #ffc58f;">(self,news)</span>:</span>
self.__latestNews = news
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">getNews</span><span class="hljs-params" style="color: #ffc58f;">(self)</span>:</span>
<span class="hljs-keyword" style="color: #ebbbff;">return</span> <span class="hljs-string" style="color: #d1f1a9;">'Got News:'</span>+self.__latestNews
<span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">Subscriber<span class="hljs-params" style="color: #ffc58f;">(metaclass=ABCMeta): <span class="hljs-comment" style="color: #7285b7;">#Observer
<span class="hljs-decorator">@abstractmethod</span>
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">update</span><span class="hljs-params" style="color: #ffc58f;">(self)</span>:</span>
<span class="hljs-keyword" style="color: #ebbbff;">pass</span>
<span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">ConcreteSubscriber1: <span class="hljs-comment" style="color: #7285b7;">#ConcreteObserver
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def <span class="hljs-title" style="color: #7285b7;">init<span class="hljs-params" style="color: #ffc58f;">(self,publisher):
self.publisher=publisher
self.publisher.attach(self)
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">update</span><span class="hljs-params" style="color: #ffc58f;">(self)</span>:</span>
print(type(self).__name__,self.publisher.getNews())
<span class="hljs-class"><span class="hljs-keyword" style="color: #ebbbff;">class <span class="hljs-title" style="color: #7285b7;">ConcreteSubscriber2:
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def <span class="hljs-title" style="color: #7285b7;">init<span class="hljs-params" style="color: #ffc58f;">(self,publisher):
self.publisher = publisher
self.publisher.attach(self)
<span class="hljs-function" style="color: #bbdaff;"><span class="hljs-keyword" style="color: #ebbbff;">def</span> <span class="hljs-title" style="color: #7285b7;">update</span><span class="hljs-params" style="color: #ffc58f;">(self)</span>:</span>
print(type(self).__name__,self.publisher.getNews())
news_publisher = NewsPublisher()
<span class="hljs-keyword" style="color: #ebbbff;">for Subscribers <span class="hljs-keyword" style="color: #ebbbff;">in [ConcreteSubscriber1,ConcreteSubscriber2]: <span class="hljs-comment" style="color: #7285b7;">#创建观察者对象
Subscribers(news_publisher)
news_publisher.addNews(<span class="hljs-string" style="color: #d1f1a9;">'HELLO WORLD')
news_publisher.notifySubscribers()
news_publisher.detach()
news_publisher.addNews(<span class="hljs-string" style="color: #d1f1a9;">'SECOND NEWS')
news_publisher.notifySubscribers()
<span class="hljs-string" style="color: #d1f1a9;">'''
ConcreteSubscriber1 Got News:HELLO WORLD
ConcreteSubscriber2 Got News:HELLO WORLD
ConcreteSubscriber1 Got News:SECOND NEWS
'''