目录
一、监听模式概
二、代码实现
三、监听模式在openstack中的使用
1.neutron_lib.callbacks.registry模块
2.rabbitmq
一、监听模式概
监听模式(观察者模式)是指观察对象监听被观察对象,当被观察对象发生变化时,所有的观察对象都能及时的知道并且自动更新,被观察对象和观察对象之间的关系是1对多。
二、代码实现
在示例中waterHeater类相当于一个被观察对象,WashingMode和DrinkingMode类相当于观察对象,waterHeater类每一个温度变化都会将这个变化通知给WashingMode和DrinkingMode类,WashingMode和DrinkingMode类会根据收到的通知完成相应的处理。
# -*- coding: utf-8 -*-
# @Author : zhangpanpan
# @File : ztest2.pyfrom abc import abstractmethodclass WaterHeater:def __init__(self):self.__observices = []self.__temperature = 25def getTemperature(self):return self.__temperaturedef setTemperature(self, temperature):self.__temperature = temperatureprint "当前的温度为: {}摄氏度".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:@abstractmethoddef update(self, waterHeater):passclass 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用来订阅消息,它相当于一个观察对象。