1.监听模式
灰太狼 147 1

一、监听模式概

监听模式(观察者模式)是指观察对象监听被观察对象,当被观察对象发生变化时,所有的观察对象都能及时的知道并且自动更新,被观察对象和观察对象之间的关系是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用来订阅消息,它相当于一个观察对象。

2.rabbitmq

预览图
评论区

索引目录