監聽模式:在物件之間定義一種一對多的關係,當這個物件發生改變時,所有依賴它的物件都會被通知到。核心就是建立起被觀察者和觀察者之間的一種自動觸發的關係。
監聽者模式是物件的行為模式,又叫發布/訂閱模式、模型/檢視模式、源/***模式或者從屬者模式。
from abc import abcmeta,abstractmethod
class
waterheater
:def
__init__
(self)
: self.__observers=
self.__temperature=
25def
gettemperature
(self)
:return self.__temperature
defsettemperature
(self,temperature)
: self.__temperature = temperature;
print
("當前溫度是:"
,str
(self.__temperature)
+"℃"
) self.__notifies(
)def
addobserver
(self,observer)
:def
__notifies
(self)
:for o in self.__observers:
o.update(self)
class
observer
(metaclass=abcmeta)
: @abstractmethod
defupdate
(self,waterheater)
:pass
class
washing
(observer)
:def
update
(self,waterheater)
:if waterheater.gettemperature(
)>=
50and waterheater.gettemperature(
)<70:
print
("可以洗澡了"
)
class
drink
(observer)
:def
update
(self,waterheater)
:if waterheater.gettemperature(
)>=
100:
print
("水燒開了,可以喝了"
)
def
testwaterheater()
: heater = waterheater(
) wash = washing(
) drink = drink(
) heater.addobserver(wash)
heater.addobserver(drink)
heater.settemperature(50)
heater.settemperature(
100)
testwaterheater(
)
執行結果:
當前溫度是: 50℃
可以洗澡了
當前溫度是: 100℃
水燒開了,可以喝了
通過上面的例子可以提取出監聽者模式的**框架:
from abc import abcmeta,abstractmethod
class
observer
(metaclass=abcmeta)
: @abstractmethod
defupdate
(self,observable,
object):
pass
class
observable
:def
__init__
(self)
: self.__observer =
defaddobserver
(self,observer)
:def
removeobserver
(self,observer)
: self.__observer.remove(observer)
defnotify
(self,
object):
for o in self.__observer:
o.update(
object
)
監聽者有兩種模式:推模型和拉模型
aaa
Python版設計模式之監聽者模式
又名觀察者模式 發布 訂閱模式 源 source listener 模式,模式的核心是 設計時要區分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,新增觀察者 刪除觀察者 監聽目標變化並通知觀察者 觀察者這至少包含乙個方法,當接收到被觀察者的通知時,做出相應的處理 即在被觀察者的監聽中呼叫 觀察者...
Python版設計模式之監聽者模式
又名觀察者模式 發布 訂閱模式 源 source listener 模式,模式的核心是 設計時要區分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,新增觀察者 刪除觀察者 監聽目標變化並通知觀察者 觀察者這至少包含乙個方法,當接收到被觀察者的通知時,做出相應的處理 即在被觀察者的監聽中呼叫 觀察者...
Python版設計模式之監聽者模式
又名觀察者模式 發布 訂閱模式 源 source listener 模式,模式的核心是 設計時要區分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,新增觀察者 刪除觀察者 監聽目標變化並通知觀察者 觀察者這至少包含乙個方法,當接收到被觀察者的通知時,做出相應的處理 即在被觀察者的監聽中呼叫 觀察者...