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

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

#-*- 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. JSP自定义标签(标签处理器 tld文件)

    标签的形式如下,标签处理器就是处理JSP页面中的标签的属性和内容,定义好之后就跟使用JSTL一样 <标签名 属性名="属性值" 属性名="属性值"> ...

  2. Python之路(第二十一篇) re模块

    一.re模块 正则表达式本身是一种小型的.高度专业化的编程语言,正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re,正则表达式模式被编译成一系列的字节码,然 ...

  3. 工具类Utils的单元测试方式

    数据质量功能已经开发完毕,但是要实现单元测试覆盖率80%以上,其他的还好,只是这个工具类实在让我摸不着头脑,其实工具类的单元测试是最简单的,只是自己想复杂了而已: 无返回值模拟: 有返回值模拟: 异常 ...

  4. 设计师别浪费时间啦,快来试试这款Sketch标注插件吧

    随着移动互联网的快速发展,用户的需求也在不断地增大,这对产品经理还有设计师的考验是越来越大.市场环境的变化让我们深信为快不破,但是一个产品的产出需要各个环节的紧密配合,但往往在产品输出过程中,由于分工 ...

  5. ubunut下安装ibus_pinyin中文输入法

    ubuntu安装中文输入法,,此处一ibus-pinyin为例为其安装中文输入法,,, 1. 设置(setting)---语言支持(language support)---汉语(chinese),,, ...

  6. Python开课复习-10/10

    1. 什么时匿名函数def 定义 的是有名函数:特点是可以通过名字重复调用 def func(): #func = 函数的内存地址 pass匿名函数就是没有名字的函数:特点是只能在定义时使用一次 2. ...

  7. 717. 1-bit and 2-bit Characters

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...

  8. JSAAS 平台实现 微信类似的TOKEN机制

    在企业微信中,我们在调用微信接口时,我们需要首先获取token,然后根据token,调用API接口方法.这个token是有生命周期的,微信的token默认的生命周期是7200秒. 因此这个token可 ...

  9. shell 常见面试

    1.求100以内的质数 #!/bin/bash n= ;i<=n;i++)) do ;x<=i;x++)) do b=$(( $i%$x )) ]]; then a=$a+ fi done ...

  10. Linux查看登录到服务的用户,查看用户的操作已经剔掉干坏事的用户的命令

    在工作中,我们有时候会经常的切换用户,有时候会忘记切换到哪个用户了,我们就需要知道当前登录的用户时谁,可以使用: whoami 查看当前登录到系统中的用户有哪些: who 列表中显示,第一列是用户名, ...