python設計模式 觀察者模式

2021-08-17 22:49:42 字數 2496 閱讀 3543

首先先來了解乙個最簡單的觀察者模式,我就拿乙個最經典的例子來解釋

我和小明(觀察者)去訂報(觀察者行為),郵局(被觀察者)有報紙(被觀察者行為)就會通知我和小明

那麼首先來看觀察者的方法吧,觀察者裡面只有乙個介面,就是郵件給我報紙,我就有報紙了,只有這乙個抽象方法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

觀察者模式 物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。主要解決 當乙個抽象模型有兩個方面,其中乙個方面依賴於另一方面。將這二者封裝在獨立的物件中以使它們可以各自獨立地改變和復用。當對乙個物件的改變需要同時改變其它物件,而不知道具體有多少物件有...