设计模式--监听模式
一:监听模式
什么是监听模式?
监听模式是一种一对多的关系,可以有任意个观察者同时监听某一个对象。监听的对象叫观察者,被监听的对象叫被观察者。被观察者对象的内容或数据发生变化时,会通知所有监听者作出相应的变化。
监听者模式设计思想
在观察者和被观察者之间建立一种自动触发的关系。
监听模式的模型抽象
基于框架的实现
from abc import ABCMeta, abstractmethod
class Observer(metaclass=ABCMeta):
"""观察者基类"""
@abstractmethod
def update(self, observable):
pass
class Observable:
"""被观察者基类"""
def __init__(self):
print(2222)
self.observers = []
def addObserber(self, observer):
self.observers.append(observer)
def removeObserver(self, observer):
self.observers.remove(observer)
def notifies(self):
for o in self.observers:
o.update(self)
class WaterHeater(Observable):
def __init__(self):
super().__init__() # 调用父类的init
self.__temperature = 25
def getTemperature(self):
return self.__temperature
def setTemperature(self, temperature):
self.__temperature = temperature
print('当前温度是: ', temperature)
self.notifies()
class WashingMode(Observer):
def update(self, observable):
if isinstance(observable,
WaterHeater) and observable.getTemperature() >= 50 and observable.getTemperature() <= 70:
print('水已烧好,可以用来洗澡')
class DrinkMode(Observer):
def update(self, observable):
if isinstance(observable, WaterHeater) and observable.getTemperature() > 70:
print('水可以喝了')
def test():
heater = WaterHeater()
washingobserver = WashingMode()
drinkobserver = DrinkMode()
heater.addObserber(washingobserver)
heater.addObserber(drinkobserver)
heater.setTemperature(60)
heater.setTemperature(80)
test()
设计要点
- 明确谁是观察者,谁是被观察者
- Observerable在发送广播的时候,无需指定具体的Observer,Observer可以自行决定是否订阅通知
- 被观察者至少需要有三个方法,添加监听者,移除监听者,通知Observer方法。观察者知道有一个方法,更新方法,即更新当前内容
- 添加和移除监听者在不同的模型中称谓可能不同。在观察者模型中一般是addObserver/removeObserver;在源/监听器中一般是(Source/Listener);在桌面编程的窗口中可能是(attachWindow/detachWindow)
应用场景
- 对一个对象的状态或内容进行更新,需要其它对象同步更新,或者一个对象的更新需要以来其它对象的更新。
- 对象仅需要将自己的更新通知到其它对象,不需要知道其它对象的细节。