首先先來了解乙個最簡單的觀察者模式,我就拿乙個最經典的例子來解釋
我和小明(觀察者)去訂報(觀察者行為),郵局(被觀察者)有報紙(被觀察者行為)就會通知我和小明
那麼首先來看觀察者的方法吧,觀察者裡面只有乙個介面,就是郵件給我報紙,我就有報紙了,只有這乙個抽象方法has_news
observerinter
**如下
from abc import abcmeta,abstractmethod
#觀察者介面
class
observerinter
(metaclass=abcmeta):
@abstractmethod
defhas_news
(self):
再看來下觀察者類的具體實現吧,也就是我和小明,實現observerinter
抽象方法
observerimpl
**如下
#觀察者實現類
class
observeinterimpl
(observerinter):
def__init__
(self,name):
self.name = name
defhas_news
(self):
print("%s收到報紙了"%self.name)
然後就該涉及到被觀察者方法介面這塊了,也就是郵局實體類要實現的的方法,其實郵局最好只有傳送報紙的介面實現
#被觀察者介面
class
observerddinter
():def
send_news
(self,observers_list):
raise notimplementederror
然後看郵局的具體實現類
#被觀察者實現類
class
observeredinterimpl
(observerddinter):
defsend_news
(self,observers_list):
for observer in observers_list:
observer.has_news()
以上觀察者(我和小明),被觀察者(郵局)都構建好了,那麼接下來就構造乙個控制器,用來關聯觀察者和被觀察者,裡面有新增、取消觀察者的功能
#控制器
class
controlerinter
(observerddinter):
def__init__
(self,observeredinterimpl):
self.observeredinterimpl = observeredinterimpl
self.list_ =
#註冊觀察者
defregistsubscriber
(self,observers):
#解註冊觀察者
defcanclesubscriber
(self,observers):
self.list_.remove(observers)
#傳送報紙
defsend_news
(self,observers_list = none):
self.observeredinterimpl.send_news(self.list_)
最後看測試**
observer1 = observeinterimpl("safly")
observer2 = observeinterimpl("xiaoming")
observered = observeredinterimpl()
controller = controlerinter(observered)
controller.registsubscriber(observer1)
controller.registsubscriber(observer2)
controller.send_news()
最後輸出如下:
safly收到報紙了
xiaoming收到報紙了
以下來自網友:
三、觀察者模式的優點和應用場景
優點:1、觀察者與被觀察者之間是抽象耦合的;
2、可以將許多符合單一職責原則的模組進行觸發,也可以很方便地實現廣播。
應用場景:
1、訊息交換場景。如上述說到的訊息佇列等;
2、多級觸發場景。比如支援中斷模式的場景中,乙個中斷即會引發一連串反應,就可以使用觀察者模式。
四、觀察者模式的缺點
1、觀察者模式可能會帶來整體系統效率的浪費;
2、如果被觀察者之間有依賴關係,其邏輯關係的梳理需要費些心思
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
觀察者模式 物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。主要解決 當乙個抽象模型有兩個方面,其中乙個方面依賴於另一方面。將這二者封裝在獨立的物件中以使它們可以各自獨立地改變和復用。當對乙個物件的改變需要同時改變其它物件,而不知道具體有多少物件有...