设计模式--观察者模式--python
观察者模式: 对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 主要解决: 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。 例子:
主体:报社,报社的业务就是出版报纸
只要有新的报值更新,就会送给订阅了的读者A,读者B等等 观察者:读者,AB订阅了报纸,那么只要有更新,就会送给AB
A取消了订阅,那么即使报纸更新了,也不会送给A,
#主体
class Subject(object):
def __init__(self):
#_observers [元素是观察者observer的对象]
#这里将主体和观察者绑定到一块儿了 self._observers = [] #增加观察/订阅者
def add_observer(self, observer):
if not observer in self._observers:
self._observers.append(observer)
#删除观察/订阅者
def delete_observer(self, observer):
self._observers.remove(observer) #通知观察/订阅者 更新
def notify_observer(self):
for observer in self._observers:
#调用的观察者的自定义的update方法
observer.update(self) # 具体的主题(新闻),这里NewsData继承了Sudject
class NewsData(Subject): def __init__(self, name,data=0):
#等于super(Subject,self).__init__()
#不覆盖subjet父类的init方法
Subject.__init__(self)
self.name = name
self.data=data def begin_change(self, value):
self.data = value
self.notify_observer() #具体观察者observer1号
class ObserverA:
#subject变化后,依赖subject的那部分数据也要跟着更新
#此方法早Subject的notify_observers中被调用 def update(self,newsdata):
print('我是订阅者A,正在的新闻名称%s, 第%s次变化' %
(newsdata.name, newsdata.data))
#具体观察者observer2号
class ObserverB:
#subject变化后,依赖subject的那部分数据也要跟着更新
def update(self,newsdata):
print('我是订阅者B,正在的新闻名称%s, 第%s次变化' %
(newsdata.name, newsdata.data)) #主体开始发布新闻
newsdata=NewsData('北京突发新闻')
observera=ObserverA()
observerb=ObserverB()
#添加订阅者
newsdata.add_observer(observera)
newsdata.add_observer(observerb)
#通知订阅着
newsdata.begin_change(4) #订阅者无序给便任何代码,就可以随着主题更新而更新了
# 我是订阅者A,正在的新闻名称北京突发新闻, 第4次变化
# 我是订阅者B,正在的新闻名称北京突发新闻, 第4次变化
设计模式--观察者模式--python的更多相关文章
- 设计模式及Python实现
设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用该方案而不必做重复劳动.” 设计 ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- 浅谈设计模式及python实现
设计模式及Python实现 设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用 ...
- 18. 星际争霸之php设计模式--观察者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- js设计模式-观察者模式
定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- 学点PYTHON基础的东东--数据结构,算法,设计模式---观察者模式
按照小明明的设计模式抄抄看看.. http://dongweiming.github.io/python-observer.html # 这个是观察者基类 class Subject(object): ...
随机推荐
- 八,kubernetes集群存储卷基础。
目录 存储卷 存储的分类 emptyDir 测试及使用 hostpath实例 Pod测试挂在共享NFS 写测试清单 测试 pv, pvc 创建几个PV 创建测试的Pod 和 PVC 存储卷 pod运行 ...
- python常用模块:pickle、shelve、json、xml、configparser
今日内容主要有: 一.pickle模块二.shelve模块三.json模块四.json练习五.xml模块 六.xml练习七.configparser模块 一.pickle模块 #pickle是一个用来 ...
- 解决国内安装tensorflow, opencv等安装不成功或下载太慢问题
解决国内安装tensorflow, opencv等安装不成功或下载太慢问题 复制自博客:https://blog.csdn.net/jorg_zhao/article/details/80075293 ...
- C++第三次作业:作用域
作用域的定义 作用域是一个标识符在程序正文中有效的区域. 1.函数原型作用域 在函数原型声明时形式参数的作用范围就是函数原型作用域. 它是C++程序中最小的作用域. 例: double area(do ...
- Java语言基础(12)
1 构造方法重载 在一个类内部,编写多个构造方法,创建对象的时候,根据需求的不同,调用不同的构造方法创建对象,实现不同的初始化. 案例:Demo1 public class Demo1 { publi ...
- Diagonal Walking v.2 CodeForces - 1036B (思维,贪心)
Diagonal Walking v.2 CodeForces - 1036B Mikhail walks on a Cartesian plane. He starts at the point ( ...
- BZOJ1491 [NOI2007]社交网络[最短路计数]
$n$非常的小,结合题目计算式可以想到$O(n^3)$暴枚$s,t,v$,看$v$在不在$s\to t$最短路上($dis_{s,v}+dis_{v,t}=dis_{s,v}$是$v$在两点最短路上的 ...
- zeromq实践
zeromq简介 zeroMQ不是TCP,不是socket,也不是消息队列,而是这些的综合体. ZeroMQ以嵌入式网络编程库的形式实现了一个并行开发框架(concurrency framework) ...
- 微信小程序aes前后端加密解密交互
aes前后端加密解密交互 小程序端 1. 首先引入aes.js /** * [description] CryptoJS v3.1.2 * [description] zhuangzhudada so ...
- Python3-os模块详解
import os # 返回一个目录的名称 print(os.path.basename("d:/python")) # 返回一个目录的目录名 print(os.path.dirn ...