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

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

#-*- 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)

Python 高级编程 ——观察者模式的更多相关文章

  1. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  2. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  3. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  4. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  5. python高级编程之选择好名称:完

    由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...

  6. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  7. python高级编程之列表推导式

    1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...

  8. Python高级编程之生成器(Generator)与coroutine(二):coroutine介绍

    原创作品,转载请注明出处:点我 上一篇文章Python高级编程之生成器(Generator)与coroutine(一):Generator中,我们介绍了什么是Generator,以及写了几个使用Gen ...

  9. Python高级编程-Python一切皆对象

    Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 ""&qu ...

随机推荐

  1. 判断某个字符串里面是否包含caoyang 这个字符串?

    $string = 'Lorem ipsum dolor sit amet'; $preg = '/caoyang/'; $status = preg_match($preg, $string,$ma ...

  2. Eclipse新建tld文件

    tld(tag lib description文件)就是以.tld结尾的XML文件 选好目录右键 --> New --> Other -->找到XML FIle --> Nex ...

  3. lodash 中常用的方法

    odash是js集Array/Object/String/Function的Util于一身. lodash打包了Array/Object/String/Function里一些Api,好处是连ES6的也 ...

  4. java mail 读取邮件列表,

    // 准备连接服务器的会话信息 Properties props = new Properties(); props.setProperty("mail.store.protocol&quo ...

  5. 【转】C#异步的世界【上】

    [转]C#异步的世界[上] 新进阶的程序员可能对async.await用得比较多,却对之前的异步了解甚少.本人就是此类,因此打算回顾学习下异步的进化史. 本文主要是回顾async异步模式之前的异步,下 ...

  6. 【Web】Nginx配置开机启动

    在添加nginx服务之后,大家会希望开机伴随启动nginx,避免手动路径输入启动: nginx官方提供了启动脚本:https://www.nginx.com/resources/wiki/start/ ...

  7. vue.js实现购物车功能

    购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3 ...

  8. 用python实现数学多元数学方程式计算

    题目:公鸡5元钱一只,母鸡3元钱一只,小鸡3只一块钱,其中公鸡,母鸡,小鸡都必须有,问公鸡,母鸡,小鸡各买多少只刚好凑足100元钱? 一:数学算术分析: x+y+z=100 5x+3y+z/3=100 ...

  9. k-SLAM:k-mer Sorted List Alignment and Metagenomics

    k-SLAM 是基于大量高通量宏基因组序列数据分析的比对程序,它基于k-mer技术上在reads和序列之间进行比较,然后用Smith-Waterman算法验证.校准是连接在一起组成一个伪组装用来提高特 ...

  10. matlab柱面图

    f=@(x,y)log(y);  % ln(x)函数,平行于x轴ezsurf(f,[-pi*2,pi*2,0,20])