观察者模式:

对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

主要解决:

当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

例子:
主体:报社,报社的业务就是出版报纸
只要有新的报值更新,就会送给订阅了的读者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的更多相关文章

  1. 设计模式及Python实现

    设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用该方案而不必做重复劳动.” 设计 ...

  2. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  3. 浅谈设计模式及python实现

    设计模式及Python实现   设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用 ...

  4. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  6. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  7. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  8. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  9. 学点PYTHON基础的东东--数据结构,算法,设计模式---观察者模式

    按照小明明的设计模式抄抄看看.. http://dongweiming.github.io/python-observer.html # 这个是观察者基类 class Subject(object): ...

随机推荐

  1. C# 基础 字符串 集合 文件操作

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. ubuntu16.04环境LNMP实现PHP5.6和PHP7.2

    最近因为公司突然间说要升级php7,所以做个记录 PPA 方式安装 php7.2 : sudo apt-get install software-properties-common 添加 php7 的 ...

  3. OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发

    OPNsense防火墙搭建实验环境,MSF与SSH进行流量转发 摘要: 记录实验过程中踩到的坑.介绍OPNsense防火墙的安装配置并搭建实验环境,利用msf的模块及ssh进行流量转发(LAN向DMZ ...

  4. NoSQL数据库技术实战-第1章 NoSQL的数据一致性 传统关系型数据库的ACID

    在看着章节的时候,我简单的回顾了一下关系型数据库的事务处理的ACID原则,其中原子性和持久性比较好理解.由于以前没有深入去研究.关于一致性和隔离性上我产生了疑问,在整理后分析如下:   一致性:书中所 ...

  5. 观察数组 -vue

    1.vue中的被包装的观察数组能够触发视图更新 2.有push(),pop(),shift(),unshift(),splice(),sort(),reverse() 3.不能检测到下面数组变化: 1 ...

  6. MySQL(MariaDB)默认密码和修改方法

    由于笔者只测试过Ubuntu 16.04.4.Ubuntu 19.04和Debian 9,此方法不确定在其他版本下适用. 本文章介绍的方法同样适用于这样的错误信息. ➜ ~ mysql -u root ...

  7. Ribbon整合Consul,出现No instances available for XXX 异常

    先贴代码: @RestController public class CallHelloController { @Autowired private LoadBalancerClient loadB ...

  8. 【winfrom-Button】设置带图标样式的Button

    this.myButton.BackColor = System.Drawing.SystemColors.Control; this.myButton.FlatAppearance.BorderCo ...

  9. node简单起服务

    1.建一个app.js文件 const http = require('http'); const chalk = require('chalk'); const conf = require('./ ...

  10. MySQL的btree索引和hash索引区别

     在使用MySQL索引的时候, 选择b-tree还是hash hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范 ...