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

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

#-*- 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. LFI/RFI总结

    目录 0×01 文件包含简介 服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间.这意味着您可以创建供所有网页引用的标准页眉或菜单 ...

  2. 解析vue2.0中render:h=>h(App)的具体意思

    render:h=>h(App)是ES6中的箭头函数写法,等价于render:function(h){return h(App);}. 注意点:1.箭头函数中的this是 指向 包裹this所在 ...

  3. Vue修饰符

    为了方便大家写代码,vue.js给大家提供了很多方便的修饰符,比如我们经常用到的取消冒泡,阻止默认事件等等~ 目录 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v-bind修饰符(实在不知道叫 ...

  4. springmvc相关

    Springmvc的请求注解可分为四类: url请求地址(PathVariable). head请求头(RequestHeader.CookieValue). body请求体(RequestParam ...

  5. netty1 快速入门

    Netty是一个高性能.异步事件驱动的网路通信框架 ,由于精力有限,本人并没有对其源 码做了特别细致的研究.如果下面的内容有错误或不严谨的地方,也请大家指正和谅解. Netty的线程模型是Reacto ...

  6. tomcat 配置域名访问应用

    <Host appBase="webapps" autoDeploy="true" name="www.XXX.com" unpack ...

  7. eclipse构建maven的web项目(转载)

    eclipse构建maven的web项目 分类: java opensource2013-12-25 16:22 43人阅读 评论(0) 收藏 举报 maven框架webappwebeclipse 使 ...

  8. SpringMVC学习笔记:单例与并发问题

    Spring中的Bean默认都是单例(singleton),Spring中Bean的scope属性有五种类型: singleton 表示在spring容器中的单例,通过spring容器获得该bean时 ...

  9. hdu 6073

    题意: 给出一个二部图,U.V分别是二部图的两个点集,其中,U中每个点会有两条边连到V中两个不同的点. 完美匹配定义为:所有点都成功匹配. 思路:已知一定是完美匹配了呀(也一定存在),我们先把度数为一 ...

  10. Django的学习(二)————Templates

    一.django的模板: 在settings.py的文件中可以看到并设置这个模板. 1.直接映射: 通过建立的文件夹(templates)和文件(html)来映射. <!DOCTYPE html ...