监听设计模式
监听模式:又名观察者模式,顾名思意就是观察与被观察的关系,比如你在烧开水得时时看着它开没开,你就是观察者,水就是被观察者;再比如说你在带小孩,你关注她是不是饿了,是不是喝了,是不是撒尿了,你就是观察者,小孩就是被观察者。
我们来监控热水器的温度,单温度变化的时候会触发不同对象下面的不同方法
'''被监听对象'''
class WaterHeater:
def __init__(self):
self.__observers = []
self.__temperature = 25
def getTemperature(self):
return self.__temperature
def setTemperature(self, temperature):
self.__temperature = temperature
print("当前温度是:", self.__temperature)
self.notifies()
'''把观察者对象放到列表中'''
def addObserver(self, observer):
self.__observers.append(observer)
'''便利观察者对象中的方法'''
def notifies(self):
for o in self.__observers:
o.update(self)
'''监听者的父类'''
class Observer:
"洗澡模式和饮用模式的父类"
def update(self, waterHeater):
pass
'''实际监听者'''
class WashingMode(Observer):
"该模式用于洗澡用"
def update(self, waterHeater):
if waterHeater.getTemperature() >= 50 and waterHeater.getTemperature() < 70:
print("水已烧好,温度正好!可以用来洗澡了。")
'''实际监听者'''
class DrinkingMode(Observer):
"该模式用于饮用"
def update(self, waterHeater):
if waterHeater.getTemperature() >= 100:
print("水已烧开!可以用来饮用了。")
'''监听设计模式'''
def testWaterHeater():
heater = WaterHeater()
washingObser = WashingMode()
drinkingObser = DrinkingMode()
heater.addObserver(washingObser)
heater.addObserver(drinkingObser)
heater.setTemperature(40)
heater.setTemperature(60)
heater.setTemperature(100)
testWaterHeater()
输出的结果为:
current temperature is: 40
current temperature is: 60
水已烧好,温度正好!可以用来洗澡了。
current temperature is: 100
水已烧开!可以用来饮用了。
我们还可以抽象出监听对象:
from abc import ABCMeta,abstractmethod
class Observer(metaclass=ABCMeta):
"观察者的父类"
@abstractmethod
def update(self, observer, object):
pass
class Observable:
"被观察者的父类"
def __init__(self):
self.__observers = []
def addObserver(self, observer):
self.__observers.append(observer)
def removeObserver(self, observer):
self.__observers.remove(observer)
def notifyObservers(self, object = 0):
for o in self.__observers:
o.update(self, object)
class WaterHeater(Observable):
def __init__(self):
super().__init__()
self.__temperature = 25
def getTemperature(self):
return self.__temperature
def setTemperature(self, temperature):
self.__temperature = temperature
print("current temperature is:", self.__temperature)
self.notifyObservers()
class WashingMode(Observer):
"该模式用于洗澡用"
def update(self, observable, object):
if isinstance(observable,
WaterHeater) and observable.getTemperature() >= 50 and observable.getTemperature() < 70:
print("水已烧好,温度正好!可以用来洗澡了。")
class DrinkingMode(Observer):
"该模式用于饮用"
def update(self, observable, object):
if isinstance(observable, WaterHeater) and observable.getTemperature() >= 100:
print("水已烧开!可以用来饮用了。")
def testWaterHeater():
heater = WaterHeater()
washingObser = WashingMode()
drinkingObser = DrinkingMode()
heater.addObserver(washingObser)
heater.addObserver(drinkingObser)
heater.setTemperature(40)
heater.setTemperature(60)
heater.setTemperature(100)
testWaterHeater()
对象模型为:
输出和上面输出是一样的。
监听模式就是说当一个数据改变,与其相关的对象数据也要跟着改变。
每天都要进步一点点才行。
业精于勤,荒于嬉;
行成于思,毁于随。