觀察者模式:物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時, 所有依賴於它的物件都得到通知並被自動更新。
主要解決:
當乙個抽象模型有兩個方面, 其中乙個方面依賴於另一方面。將這二者封裝在獨立的物件中以使它們可以各自獨立地改變和復用。
當對乙個物件的改變需要同時改變其它物件, 而不知道具體有多少物件有待改變。
當乙個物件必須通知其它物件,而它又不能假定其它物件是誰。
例子:主體:報社,報社的業務就是出版報紙
只要有新的報值更新,就會送給訂閱了的讀者a,讀者b等等
觀察者:讀者,ab訂閱了報紙,那麼只要有更新,就會送給ab
a取消了訂閱,那麼即使報紙更新了,也不會送給a,
#主體class subject(object):
def __init__(self):
#_observers [元素是觀察者observer的物件]
#這裡將主體和觀察者繫結到一塊兒了
self._observers =
#增加觀察/訂閱者
def add_observer(self, observer):
if not observer in self._observers:
#刪除觀察/訂閱者
def delete_observer(self, observer):
self._observers.remove(observer)
#通知觀察/訂閱者 更新
def notify_observer(self):
for observer in self._observers:
#呼叫的觀察者的自定義的update方法
observer.update(self)
# 具體的主題(新聞),這裡newsdata繼承了sudject
class newsdata(subject):
def __init__(self, name,data=0):
#等於super(subject,self).__init__()
#不覆蓋subjet父類的init方法
subject.__init__(self)
self.name = name
self.data=data
def begin_change(self, value):
self.data = value
self.notify_observer()
#具體觀察者observer1號
class observera:
#subject變化後,依賴subject的那部分資料也要跟著更新
#此方法早subject的notify_observers中被呼叫
def update(self,newsdata):
print('我是訂閱者a,正在的新聞名稱%s, 第%s次變化' %
(newsdata.name, newsdata.data))
#具體觀察者observer2號
class observerb:
#subject變化後,依賴subject的那部分資料也要跟著更新
def update(self,newsdata):
print('我是訂閱者b,正在的新聞名稱%s, 第%s次變化' %
(newsdata.name, newsdata.data))
#主體開始發布新聞
newsdata=newsdata('北京突發新聞')
observera=observera()
observerb=observerb()
#新增訂閱者
newsdata.add_observer(observera)
newsdata.add_observer(observerb)
#通知訂閱著
newsdata.begin_change(4)
#訂閱者無序給便任何**,就可以隨著主題更新而更新了
# 我是訂閱者a,正在的新聞名稱北京突發新聞, 第4次變化
# 我是訂閱者b,正在的新聞名稱北京突發新聞, 第4次變化
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
Python設計模式 觀察者模式
基於3.5.2,如下 coding utf 8 觀察者設計模式 class observerinte ce def update self,value raise notimplementederror class nbaperson observerinte ce def init self,na...
python設計模式 觀察者模式
首先先來了解乙個最簡單的觀察者模式,我就拿乙個最經典的例子來解釋 我和小明 觀察者 去訂報 觀察者行為 郵局 被觀察者 有報紙 被觀察者行為 就會通知我和小明 那麼首先來看觀察者的方法吧,觀察者裡面只有乙個介面,就是郵件給我報紙,我就有報紙了,只有這乙個抽象方法has news observerin...