观察者模式:

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

主要解决:

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

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

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

例子:
主体:报社,报社的业务就是出版报纸
只要有新的报值更新,就会送给订阅了的读者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. sql DATEDIFF 函数

    sql  DATEDIFF 函数 今天的所有数据: 昨天的所有数据: 7天内的所有数据: 30天内的所有数据: 半个月的所有数据: 本月的所有数据: 上月的所有数据: 本年的所有数据: --查询今天是 ...

  2. centos 7 安装 Docker Engine-CentOS 社区版

    获取Docker Engine-CentOS社区: https://docs.docker.com/install/linux/docker-ce/centos/ 1.操作系统要求 1.1 要安装 D ...

  3. MySQL 安装与基本概念

    Mysql版本 第一条产品线:5.0.xx及升级到5.1.xx的产品系列,这条产品线继续完善与改进其用户体验和性能,同时增加新功能,这条路线可以说是MySQL早期产品的延续系列,这一系列的产品发布情况 ...

  4. 【原创】马哥 文本三剑客之awk

    命令 awk 全称: man搜索: 简述 基本用法 选项 用法与实验 print 打印 (1)(2)(3) 变量 1.内建变量 FS与OFS RS与ORS NR与FNR NF ARGC与ARGC 2. ...

  5. storcli/percli的使用场景

    目录 storcli/percli常用场景 storcli/percli常用场景 查看帮助信息 storcli64 help 查看控制器数量 storcli64 show ctrlcount [roo ...

  6. Toast的基本用法 吐司打印

    //Toast.makeText(上下文,内容,显示时间);Toast toast =Toast.makeText(this,"位置="+position+"内容=&qu ...

  7. NOIP2016 Day1 T2 天天爱跑步(树上差分,LCA)

    原文链接 原题链接 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏 ...

  8. CSS基础学习-4.CSS属性_背景、颜色、边框

  9. 数据管理必看!Kendo UI for jQuery过滤器概述

    Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...

  10. Java-Base64工具类

    /* * Base64 encoding and decoding. * Copyright (C) 2001-2004 Stephen Ostermiller * http://ostermille ...