Python 監聽模式

2021-09-29 18:05:15 字數 3101 閱讀 5148

監聽模式

我們希望在乙個物件的狀態改變時更新另乙個物件,即類似mcv模式,當多個檢視共用一組模型資料時,只要有乙個檢視進行了資料的修改,其他檢視都可以進行更新。

上面的問題就是監聽模式需要去解決的。怎麼解決?

定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都可以得到通知,並根據通知按需進行自動更新

狀態改變後,所有的依賴物件都將得到通知(廣播通知)

重點—— 在被觀察者類中,加入乙個arraylist存放觀察者,這裡就涉及到乙個挺有意思的問題,被觀察者對不同的觀察者傳送推送訊息是有順序的。

應用場合:

設計乙個被觀察者,一組觀察者。

被觀察者需要有三個基本的方法:

觀察者至少要有乙個方法:

基本**:

# -*- coding: utf-8 -*-

# 定義乙個發布者/被觀察者

class

publisher

:def

__init__

(self)

:# 用於放置觀察者

self.__observers =

#todo:檢查觀察者列表是否為空

defhasobserver

(self)

:return

false

ifnot self.__observers else

true

#todo:新增觀察者

defaddobserver

(self,observer)

:# 新增之前檢查是否存在

if observer not

in self.__observers:

else

:print

("failed to add:{}"

.format

(observer)

)#todo:移除觀察者

defremoveobserver

(self,observer)

:try

: self.__observers.remove(observer)

except valueerror:

print

("failed to remove:{}"

.format

(observer)

)#todo:發布訊息

defnotify

(self)

:for observer in self.__observer:

observer.update(self)

# 定義乙個訂閱者/觀察者

class

observer

:def

update

(self,publiser)

:pass

例項

from observer import publisher,observer

class

defaultformatter

(publisher)

:def

__init__

(self,name)

:super

(defaultformatter, self)

.__init__(

) self.name = name

self._data =

0# todo: 返回關於發布者名稱和 _data值的資訊

def__str__

(self)

:return

"{}:{} has data = {}"

.format

(type

(self)

.__name__,self.name, self._data)

defdata

(self)

:return self._data

defsetdata

(self, value)

:try

: self._data =

int(value)

except valueerror as e:

print

('error:{}'

.format

(e))

else

:print

('修改了'

) self.notify(

)class

hexformatter

(observer)

:def

update

(self, publiser)

:print

("hex data = {}"

.format

(hex

(publiser.data())

))class

binaryformatter

(observer)

:def

update

(self, publiser)

:print

("bin data = {}"

.format

(bin

(publiser.data())

))if __name__ ==

'__main__'

:# 建立publisher和observer

default = defaultformatter(

"test"

) hexformatter = hexformatter(

) binformatter = binaryformatter(

) default.addobserver(hexformatter)

default.addobserver(binformatter)

# publisher狀態更新

default.setdata(1)

default.setdata(10)

# 移除乙個observer

default.removeobserver(hexformatter)

default.setdata(

20)

Python設計模式 監聽者模式

監聽模式 在物件之間定義一種一對多的關係,當這個物件發生改變時,所有依賴它的物件都會被通知到。核心就是建立起被觀察者和觀察者之間的一種自動觸發的關係。監聽者模式是物件的行為模式,又叫發布 訂閱模式 模型 檢視模式 源 模式或者從屬者模式。from abc import abcmeta,abstrac...

Python設計攻略 《監聽模式》

這是著名的例子。假設我們生活在乙個70年代的家庭,剛發明了電熱水爐,但由於熱水爐沒有顯示水溫,我們需要有乙個監聽器去監察現在的水溫。如果只顯示水溫當然沒有難度,但若果這個熱水爐不同溫度時能夠做到不同的功能的話,那麼程式碼就會變得重複而冗長。這時候 監聽模式 就大派用場,大大地縮短了程式碼行數。但我們...

Python版設計模式之監聽者模式

又名觀察者模式 發布 訂閱模式 源 source listener 模式,模式的核心是 設計時要區分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,新增觀察者 刪除觀察者 監聽目標變化並通知觀察者 觀察者這至少包含乙個方法,當接收到被觀察者的通知時,做出相應的處理 即在被觀察者的監聽中呼叫 觀察者...