Python之觀察者模式 發布訂閱

2022-09-08 11:39:15 字數 2716 閱讀 1098

觀察者模式是一種物件行為模式。它定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新,這種模式有時又稱作發布-訂閱模式、模型-檢視模式。在觀察者模式中,主體是通知的發布者,它發出通知時並不需要知道誰是它的觀察者,可以有任意數目的觀察者訂閱並接收通知。觀察者模式不僅被廣泛應用於軟體介面元素之間的互動,在業務物件之間的互動、許可權管理等方面也有廣泛的應用。

例如,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。

觀察者模式的結構:

抽象主題(abstractsubject):也叫抽象目標類,它提供了乙個用於儲存觀察者物件的聚集類和增加、刪除觀察者物件的方法,以及通知所有觀察者的抽象方法

具體主題(subject):也叫具體目標類,它實現抽象目標中的通知方法,當具體主題的內部狀態發生改變時,通知所有註冊過的觀察者物件。

抽象觀察者(abstractobserver):它是乙個抽象類或介面,它包含了乙個更新自己的抽象方法,當接到具體主題的更改通知時被呼叫。

具體觀察者(observer):實現抽象觀察者中定義的抽象方法,以便在得到目標的更改通知時更新自身的狀態。

"""抽象主題(抽象目標類):

定義增加、刪除觀察者的方法

通知觀察者的抽象方法

"""def

__init__

(self):

self.observers =

defadd(self, observer):

if observer not

inself.observers:

else

:

print("

%s observer is exist, add failed

" %observer)

defremove(self, observer):

if observer in

self.observers:

self.observers.remove(observer)

else

:

print("

%s observer is not exist, remove failed

" %observer)

@abc.abstractmethod

defnotify(self):

pass

class

subject(abstractsubject):

"""具體主題(具體目標類)

"""def

__init__

(self, name):

super().

__init__

() self.name =name

self._data =none

@property

defdata(self):

return

self._data

@data.setter

defdata(self, new_data):

"""當資料更新時,去通知觀察者

"""self._data =new_data

self.notify()

defnotify(self):

"""通知觀察者的具體方法

"""for obs in

self.observers:

obs.notify(self._data)

class abstractobserver(metaclass=abc.abcmeta):

"""抽象觀察者

"""@abc.abstractmethod

def notify(self, data, *args, **kwargs):

pass

class

observer1(abstractobserver):

"""具體觀察者-1

"""def notify(self, data, *args, **kwargs):

print("

發布的訊息是:%s

" %data)

class

observer2(abstractobserver):

"""具體觀察者-2

"""def notify(self, data, *args, **kwargs):

print("

發布的訊息是:%s

" %data)

#具體主題(訊息發布者)

sub = subject("

ming")

#具體觀察者

obs1 =observer1()

obs2 =observer2()

#新增觀察者

sub.add(obs1)

sub.add(obs2)

#發布訊息後,觀察者得到訊息

sub.data = "

號外號外!

"

python觀察者模式 python 觀察者模式

python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...

觀察者模式(發布訂閱模式)

簡介 觀察者模式 又被稱為發布 訂閱 public subscribe 模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件再狀態變化時,會通知所有的觀察者物件,使他們能夠自動更新自己。塊 public 發布動態 button 觀察者 粉絲 ...

觀察者模式 訂閱發布模式

觀察者模式是一種物件間的一對多依賴關係,當乙個物件的狀態發生變化時,所有依賴他的物件都將得到通知。通常運用在物件之間的訊息通訊中。比如現在有一群學生,可以組成小組,可以尋求幫助 class students askforhelp subject 向大家尋求幫助 this.tasks.foreach ...