監聽模式
我們希望在乙個物件的狀態改變時更新另乙個物件,即類似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 模式,模式的核心是 設計時要區分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,新增觀察者 刪除觀察者 監聽目標變化並通知觀察者 觀察者這至少包含乙個方法,當接收到被觀察者的通知時,做出相應的處理 即在被觀察者的監聽中呼叫 觀察者...