前言


参考资源

Ref: 史上最全设计模式导学目录(完整版)

观察者模式-Observer Pattern【学习难度:★★★☆☆,使用频率:★★★★★】

对象间的联动——观察者模式(一):多人联机对战游戏的设计

对象间的联动——观察者模式(二):观察者模式概述

对象间的联动——观察者模式(三):多人联机对战游戏的观察者模式解决方案

对象间的联动——观察者模式(四):JDK对观察者模式的支持

对象间的联动——观察者模式(五):观察者模式与Java事件处理

对象间的联动——观察者模式(六):观察者模式与MVC,观察者模式总结

核心问题

待解决的问题:一个事件发生了,如何让所有观察者都能察觉?

将observer放在事件类中。

现实案例


一、事件类

class Publisher:

    def __init__(self):
# 注册好的观察者都在这里
self.observers = []

# 添加“观察者”
def add(self, observer):
if observer not in self.observers:
self.observers.append(observer)
else:
print('Failed to add: {}'.format(observer))

# 删除“观察者“
def remove(self, observer):
try:
self.observers.remove(observer)
except ValueError:
print('Failed to remove: {}'.format(observer))

# 通知每一位“观察者”
def notify(self):
[o.notify(self) for o in self.observers] ##########################################################
class DefaultFormatter(Publisher): def __init__(self, name):
Publisher.__init__(self)
self.name = name
self._data = 0 def __str__(self):
return "{}: '{}' has data = {}".format(type(self).__name__, self.name, self._data)

#-----------------------------------------------------
@property
def data(self):
return self._data @data.setter
def data(self, new_value):
try:
self._data = int(new_value)
except ValueError as e:
print('Error: {}'.format(e))
else:
self.notify()

二、try-except-else

当没有异常发生时,else中的语句将会被执行。

a=3
b=2
for i in range(3):
try:
a = a - 1
c=b/a
print(c) except Exception as e:
print(e)
else:
print("正常运行")

保证了“危险代码“安全通过后再执行”关键操作”。

"观察者“添加成功后,再做”事件赋值“。

三、定义 ”观察者“

这里定义了两名”观察者“,一点事件发生,”观察者“给出各自的呼应。

也就是说:添加数据成功则调用 ”观察者“ 的 ”嘴“。

class HexFormatter:

    def notify(self, publisher):
print("{}: '{}' has now hex data = {}".format(type(self).__name__, publisher.name, hex(publisher.data))) class BinaryFormatter: def notify(self, publisher):
print("{}: '{}' has now bin data = {}".format(type(self).__name__, publisher.name, bin(publisher.data)))

四、主函数

”事件“ 发生,关键是要”立即通知到观察者“,怎么办?即刻触发一个”遍历所有observers“的循环。

def main():
# (1) 创建一个 ”事件“
df = DefaultFormatter('test1')
print(df)

# (2) 创建一个”观察者“,并添加之
print()
hf = HexFormatter()
df.add(hf)
df.data = 3  # (3)”事件“ 发生,关键是要”立即通知到观察者“
print(df) bf = BinaryFormatter()
df.add(bf)
df.data = 21
print(df) df.remove(hf)
df.data = 40
print(df) print()
df.remove(hf)
df.add(bf)
df.data = 'hello'
print(df) print()
df.data = 15.8
print(df)

if __name__ == '__main__':
main()

  如何看来,就是这个”循环体“中(事件中)对内容(观察者)的控制。

End.

[Design Patterns] 03. Behavioral Patterns - Observer Pattern的更多相关文章

  1. 【设计模式】行为型03观察者模式(Observer Pattern)

    记得16年初第一次学习了23种设计模式,但是除了少数几个简单的外,其他的很多都是学了个似懂非懂,以至于有人问起甚至说不上来,现在想想,其实就是没看懂而已.例如观察者模式,其实原理很简单,但是当时并没有 ...

  2. Learning JavaScript Design Patterns The Observer Pattern

    The Observer Pattern The Observer is a design pattern where an object (known as a subject) maintains ...

  3. [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...

  4. Design Pattern: Observer Pattern

    1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...

  5. 深入浅出设计模式——观察者模式(Observer Pattern)

    模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...

  6. Observer Pattern

    Motivation We can not talk about Object Oriented Programming without considering the state of the ob ...

  7. 设计模式(二)The Observer Pattern 观察者模式

    问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...

  8. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  9. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

随机推荐

  1. C语言编程入门之--第五章C语言基本运算和表达式-part4

    5.3.5 和二进制极为密切的运算符 本小节的运算符需要借助二进制概念来理解. 二进制数据中,比如一个字节的数据,它的十进制为228,二进制就为11100100,如图5.11, 注意:如果不懂怎么转换 ...

  2. cocos creator 事件

    cocos creator 事件 在做一个消除类游戏时,需要对点击的方块做出响应.代码很简单,可背后的原理还多着呢. 1. 普通节点注册click事件 在cc中如果需要相应click事件,需要为该节点 ...

  3. 漏洞挖掘技巧之利用javascript:

    好久没更新博客了,更新一波. 场景: window.location.href=”” location=”” location.href=”” window.location.* 常见地点:任何二次跳 ...

  4. 90001PS相关操作

    第一章   PS基础操作 1.1 PS界面介绍 (1)界面包含:菜单栏.状态样式栏.工具栏.绘图区域.工作区. (2)布局可以在左上角进行切换,区分主要为工作区的侧重点不同. (3)布局想恢复可在窗口 ...

  5. 如何运用PHP+REDIS解决负载均衡后的session共享问题

    一.为什么要使用Session共享? 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的 ...

  6. 01_liteide 集成环境运行的问题

    //go语言是以包为管理单位 //每个文件必须先声明包 //程序必须有一个main包 package main import (  "fmt" ) //入口函数 func main ...

  7. NLP(二十一)根据已有文本LSTM自动生成文本

    根据已有文本LSTM自动生成文本 原理 与股票预测类似,用前面的n个字符预测下一个字符 https://www.cnblogs.com/peng8098/p/keras_5.html 代码 from ...

  8. addTarget原理

    addTarget原理: 当一个控件addTarget时,先到runLoop注册,然后runLoop才会监听该事件,事件处理按照响应者链条   以下以button为例图解:

  9. Oralce 触发器

    今天做了一个需要用到触发器实现的功能中间去到了各种问题,还好最后都解决了: 整个过程中真是遇到了不少错误: ORA-04091: 表 KPGO.T_ISSUER 发生了变化, 触发器/函数不能读它 O ...

  10. 模板汇总——ST(暂)

    int Log[N]; struct ST { ], a[N]; void init(int n) { ]=-); i < N; i++) Log[i] = Log[i - ] + ((i &a ...