#-*- coding:utf-8 -*-
classObserver(object):#此处初始化一个列表,用来收集 “观察者”
def __init__(self):
self._observers=[]#注册一个观察者,注册一个就往列表里添一个,同时更新一下他的数据
defregisterObserver(self, observer):
self._observers.append(observer)
observer.update(self)#调用观察者函数的 update方法, self 是对 model 参数的赋值
#注销一个观察者,直接移走它,以后数据更新了,跟他毛关系都没了
defremoveObserver(self, observer):
self._observers.remove(observer)#通过遍历 通知每一个观察者,数据更新了
defnotifyObserver(self):for observer inself._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方法,当数据改变时,更新当前数据,然后通知每一个观察者数据变了,要更新了
defvalueChanged(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
classCurrentCondition(object):def __init__(self):
self.currData=[]#每一个观察者都有一个update方法,Observer类里面的registerObserver, notifyObservers方法就是调用的这个update
defupdate(self, model):print('i am update')
self.currData.append((model.temp, model.humidity, model.pressure))#这个布告板对气象数据进行统计
classStaticsCondition(object):#初始化了三个列表,分别存放温度,湿度和压力,这样方便统计最大值,最小值和平均值
def __init__(self):
self.setDataTemp=[]
self.setDataHumidity=[]
self.setDataPressure=[]#它的update方法是将每个参数放到各自的列表中去
defupdate(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)