Python笔记:设计模式之观察者模式
观察者模式中的主题对象一般存在着一个其他服务依赖的核心服务,并且维护着其他依赖此核心服务的对象列表(即观察者或监视者列表),当主题对象发生变化时,观察者应该改变自己的状态或者进行某些操作
观察者模式中的三个角色:
- 主题:即观察者观察的对象,一般是需要有注册和注销方法,用来添加观察者和删除观察者。
- 观察者基类:这个类主要是需要定义一个接口,以便主题发生变化时可以得到对应的通知信息。
- 观察者:这个类需要具体实现基类中的“通知”接口,以便和主题的变化保持同步。
主题的两种通知方式:
- 拉模型:这个方式重心在观察者上,当主题发生变化时,会广播所有的观察者,然后由观察者来获取相应的数据。
- 推模型:这个方式重心在主题上,当主题发生变化时,主题将根据观察者的需要将自身的变化推送给需要的观察者。
观察者模式的优点:
- 观察者模式中彼此交互的对象都是保持松耦合的。主题对观察者唯一的了解就是观察者实现的“通知”接口,除此之外它们之间都是互不影响且独立存在的,可以根据需要对自身作出修改。
- 可以随时添加或删除观察者。
- 这种模式下,可以在很少甚至不修改主题或观察者的情况下进行对象之间高效的数据发送。
其他注意点:
- 观察者模式中是可以有多个主题和多个观察者之间的对应关系的,但是一定要弄清楚它们之间的关系以及变化,不然就会变得非常复杂。
- 一般情况是由主题来触发“通知”方法的,但是在特殊情况下也可以由观察者来触发“通知”方法。
简单示例:
from abc import ABCMeta, abstractmethod class Publisher:
"""被观察者:发布/订阅关系中的发布对象"""
def __init__(self):
self.subscribers = []
self.latest_content = None def set_content(self, content):
"""有新消息时,发布新的消息"""
self.latest_content = content
self.publish() def get_latest_content(self):
"""获取最新的消息"""
return self.latest_content def register(self, subscriber):
"""注册一个新的订阅者"""
self.subscribers.append(subscriber) def publish(self):
"""发布消息并通知订阅的用户"""
for subscriber in self.subscribers:
subscriber.notify() class Subscriber(metaclass=ABCMeta):
"""观察者的抽象类:需要定义一个通知接口,用于发布对象通知订阅的用户"""
@abstractmethod
def notify(self):
pass class SubscriberA(Subscriber):
"""观察者A:发布/订阅关系中的订阅者,当订阅的发布者有新的变化或动态的时候能及时收到通知"""
def __init__(self):
self.my_publisher = None def subscribe(self, publisher):
"""订阅并进行注册"""
self.my_publisher = publisher
self.my_publisher.register(self) def notify(self):
"""获取最新消息"""
latest_content = self.my_publisher.get_latest_content()
print(self, latest_content) class SubscriberB(Subscriber):
"""观察者B:发布/订阅关系中的订阅者,当订阅的发布者有新的变化或动态的时候能及时收到通知"""
def __init__(self):
self.my_publisher = None def subscribe(self, publisher):
"""订阅并进行注册"""
self.my_publisher = publisher
self.my_publisher.register(self) def notify(self):
"""获取最新消息"""
latest_content = self.my_publisher.get_latest_content()
print(self, latest_content) if __name__ == '__main__':
new_publisher = Publisher()
subscriber_a = SubscriberA()
subscriber_a.subscribe(new_publisher)
subscriber_b = SubscriberB()
subscriber_b.subscribe(new_publisher)
new_publisher.set_content('This is a new message!')
Python笔记:设计模式之观察者模式的更多相关文章
- [python实现设计模式]-4.观察者模式-吃食啦!
观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...
- python笔记 - day8
python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...
- [转]Python与设计模式
一.创建类设计模式 前言 什么样的程序员是一个好的程序员?学会很多门编程语言,就是一个好的程序员了么?事实上,学会一门编程语言不是一件很难的事,而“学会”一门编程语言是非常难的一件事.前一个“会”强调 ...
- Python笔记之不可不练
如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
- 20.Python笔记之SqlAlchemy使用
Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 13.python笔记之pyyaml模块
Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...
- 8.python笔记之面向对象基础
title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...
- python笔记 - day7-1 之面向对象编程
python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...
随机推荐
- Python time.time()方法
描述 Python time time()返回当前时间的时间戳. 时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(背景时间1970年01月01日08时00分00秒)起至现在的总 ...
- ETCD:运行时重新配置
原文地址:runtime reconfiguration etcd带有增量运行时重新配置的支持.允许我们在集群运行的时候更新集群成员关系. 仅当大多数集群成员都在运行时,才能处理重新配置请求,强烈建议 ...
- C# 管道通信 (client —— server)Framework2.0版本也可用
//管道服务类public class PipServer { [DllImport("kernel32.dll", SetLastError = true)] public st ...
- 常用类-excel转csv
public class ExcelFileHelper { public static bool SaveAsCsv(string excelFilePath, string destination ...
- (转)颜色直方图, HSV直方图, histogram bins
原文链接:https://www.xuebuyuan.com/3256564.html 一个histogram,通常可以用一个列向量表示(例子中的a,b),列向量里面的每一个值就是一个bin(a,b) ...
- Linux 磁盘分区、挂载
一.分区介绍 mbr分区: 1.最多支持四个主分区 2.系统只能安装在主分区上 3.扩展分区要占一个主分区 4.mbr最大只支持2TB,但拥有最好的兼容性 gpt分区: 1.支持无限多个主分区(但操作 ...
- windows 下安装beego
好久没写博客了,最近忙于一些杂事,看见有几个博友留言了,未能及时回复,稍后晚点回复诸位博友.不多说了,windows安装beego(请先确保git环境已安装并设置了git环境变量.这个简单网上很多教程 ...
- 手把手教你避开组件cover-view的那些坑
腾讯位置服务基于微信提供的小程序插件能力,专注于(围绕)地图功能,打造一系列小程序插件,可以帮助开发者简单.快速的构建小程序,是您实现地图功能的最佳伙伴.目前微信小程序插件提供路线规划.地铁图.地图选 ...
- ABP入门教程13 - 更新菜单
点这里进入ABP入门教程目录 菜单更新 在展示层(即JD.CRS.Web.Mvc)的Startup下打开CRSNavigationProvider.cs //用以存放菜单相关信息 修改如下 using ...
- 获取当前Linux的外网地址
有时候我们在测试配置外网IP是不是成功时,我们需要使用一些命令,使用 ssh 登录可以查看ip, 还有一种可以使用命令: curl ifconfig.me 进行方便获取,公网IP:真的是非常好的服务: ...