zoukankan      html  css  js  c++  java
  • Python 高级编程 ——观察者模式

    观察者模式的定义 :
    定义了对象之间一对多依赖,当一个对象改变状态时,这个对象的所有依赖者都会收到通知并按照自己的方式进行更新。

    按照一个气象站的例子来看观察者模式 
    从气象站取得数据后要在三个布告牌显示这些数据,这三个布告牌显示的内容都不一样,一块实时显示气象数据,一块显示一段时间的统计数据,一块根据当前数据显示预测数据,当数据变化时,这三个布告牌要按照自己的方式实时更新数据,例如,实时显示布告牌就显示当前最新数据,统计数据布告牌将最大值最小值平均值显示出来。

    #-*- coding:utf-8 -*- 
    
    class Observer(object):
        #此处初始化一个列表,用来收集 “观察者”
        def __init__(self):
            self._observers = []
         
        #注册一个观察者,注册一个就往列表里添一个,同时更新一下他的数据   
        def registerObserver(self, observer):
            self._observers.append(observer)
            
            observer.update(self) #调用观察者函数的 update方法, self 是对 model 参数的赋值
        
        #注销一个观察者,直接移走它,以后数据更新了,跟他毛关系都没了    
        def removeObserver(self, observer):
            self._observers.remove(observer)
            
        #通过遍历 通知每一个观察者,数据更新了 
        def notifyObserver(self):
            for observer in self._observers:
                observer.update(self)
                
    class WeatherModel(Observer): #继承了Observer类,这样它具有Observer类的数据及方法
        
        #初始化时,加入一些初始数据
        def __init__(self, temp, humidity, pressure):
            super().__init__()
            self.temp = temp
            self.humidity = humidity
            self.pressure = pressure
        
        #增加一个valueChanged方法,当数据改变时,更新当前数据,然后通知每一个观察者数据变了,要更新了    
        def valueChanged(self, temp, humidity, pressure):
            if self.temp != temp or self.humidity != humidity or self.pressure != pressure:
                self.temp = temp
                self.humidity = humidity
                self.pressure = pressure
                self.notifyObserver()
    
    # 定义两个观察者类,CurrentCondition和StatisticCondition            
    class CurrentCondition(object):
        def __init__(self):
            self.currData=[]
        
        #每一个观察者都有一个update方法,Observer类里面的registerObserver, notifyObservers方法就是调用的这个update
        def update(self, model):
            print('i am update')
            self.currData.append((model.temp, model.humidity, model.pressure))
    
    #这个布告板对气象数据进行统计        
    class StaticsCondition(object):
        #初始化了三个列表,分别存放温度,湿度和压力,这样方便统计最大值,最小值和平均值
        def __init__(self):
            self.setDataTemp = []
            self.setDataHumidity = []
            self.setDataPressure = []
        #它的update方法是将每个参数放到各自的列表中去    
        def update(self, model):
            self.setDataHumidity.append(model.humidity)
            self.setDataTemp.append(model.temp)
            self.setDataPressure.append(model.pressure)        
            
                
    if __name__=="__main__":
        current = CurrentCondition()
        model = WeatherModel(20.0, 55.0, 1013.11)
        model.registerObserver(current)
        static = StaticsCondition()
        model.registerObserver(static)
        model.valueChanged(21.0, 52.3, 1013.12)
        model.valueChanged(21.2, 53.3, 1013.12)
        model.valueChanged(22.8, 56.1, 1013.18)
        
        print(current.currData)
        print(static.setDataTemp)
        print(static.setDataHumidity)
        print(static.setDataPressure)
        
  • 相关阅读:
    ssdb使用笔记
    跟我学爬虫-2-使用正则表达式解析文本
    跟我学爬虫-1-爬虫简介
    python int函数转换浮点型字符串的坑???
    python使用smtplib和email发送腾讯企业邮箱邮件
    php文件之间传值的三种主流并且常用的方式
    验证码的输入框与图片不能对齐问题
    web前端命名规范
    css盒子模型
    css基础
  • 原文地址:https://www.cnblogs.com/gaigaige/p/8276805.html
Copyright © 2011-2022 走看看