一、监听模式概
监听模式(观察者模式)是指观察对象监听被观察对象,当被观察对象发生变化时,所有的观察对象都能及时的知道并且自动更新,被观察对象和观察对象之间的关系是1对多。
二、代码实现
在示例中waterHeater类相当于一个被观察对象,WashingMode和DrinkingMode类相当于观察对象,waterHeater类每一个温度变化都会将这个变化通知给WashingMode和DrinkingMode类,WashingMode和DrinkingMode类会根据收到的通知完成相应的处理。
# -*- coding: utf-8 -*-
# @Author : zhangpanpan
# @File : ztest2.py
from abc import abstractmethod
class WaterHeater:
def __init__(self):
self.__observices = []
self.__temperature = 25
def getTemperature(self):
return self.__temperature
def setTemperature(self, temperature):
self.__temperature = temperature
print "当前的温度为: {}摄氏度".format(self.__temperature)
self.notifies()
def addObservice(self, observice):
self.__observices.append(observice)
def notifies(self):
for o in self.__observices:
o.update(self)
class Observice:
@abstractmethod
def update(self, waterHeater):
pass
class WashingMode(Observice):
def update(self, waterHeater):
if waterHeater.getTemperature() == 50:
print "水已烧好,可以洗澡,当前水温为: {}".format(waterHeater.getTemperature())
class DrinkingMode(Observice):
def update(self, waterHeater):
if waterHeater.getTemperature() == 100:
print "水已烧好,可以饮用,当前水温为: {}".format(waterHeater.getTemperature())
def testWaterHeater():
heater = WaterHeater()
washingObjser = WashingMode()
drinkingObjser = DrinkingMode()
heater.addObservice(washingObjser)
heater.addObservice(drinkingObjser)
for i in range(110):
heater.setTemperature(i)
testWaterHeater()
#运行结果
水已烧好,可以洗澡,当前水温为: 50
水已烧好,可以饮用,当前水温为: 100
三、监听模式在openstack中的使用
1.neutron_lib.callbacks.registry模块
neutron_lib.callbacks.registry模块称为消息的订阅/发布模块,使用registry.notify方法来发布消息,它相当于一个被观察者对象;registry.subscribe用来订阅消息,它相当于一个观察对象。