前言


参考资源

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. Eclipse配置初始化(自用)

    以上都是性能调优的配置,下面是其他常用的配置和优化 设置utf-8编码 window -> preferences -> General -> workplace中text file ...

  2. RANSAC简史

    前言 在进行泡泡机器人[图灵智库]栏目的翻译的过程中,我发现在2018-2019的顶会中,依然有很多文章(我看到的不少于6篇)对RANSAC进行各种改进,这令我感到很吃惊.毕竟该方法在1981年就被提 ...

  3. 随笔编号-02 阿里云CentOS7系列三 -- 配置防火墙

    前面讲到了安装JDK以及Tomcat.但是大家会发现,当我们访问 http:// XXX.XXX.XXX.XXX:8080/80 时候,tomcat 猫并没有出现.原因就是没有设置防火墙. 再次介绍下 ...

  4. time_wait状态如何处理和建议

    TL;DR: do not enable net.ipv4.tcp_tw_recycle. UPDATED (2017.09): net.ipv4.tcp_tw_recycle has been re ...

  5. Python Web Flask源码解读(三)——模板渲染过程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  6. Delphi - 通过WinAPI WinExec直接调用系统工具

    看如下代码: WinExec('mspaint.exe', SW_SHOWNORMAL); // SW_SHOWNORMAL = 1 系统画图 WinExec('write.exe', SW_SHOW ...

  7. 解决 java Could not resolve resource location pattern [classpath:sql/*.xml] 的问题

    时间过的真快,转眼间已经有2年了.2年里发生了太多的事,有些事依稀还记得,但更多的已经忘记.忘记了那些烦恼与忧愁,以为自己会快乐,才发现一切并不是以自己的意志为转移.终于在迷途中迷失了自己, 再也回不 ...

  8. 搭建Spark高可用集群

      Spark简介 官网地址:http://spark.apache.org/ Apache Spark™是用于大规模数据处理的统一分析引擎. 从右侧最后一条新闻看,Spark也用于AI人工智能 sp ...

  9. 选择排序&冒泡排序&折半查找

    //选择排序 void test2(int a[],int len){ //每次找出一个最小值,最小值依次与原数组交换位置,通过下标来完成交换,最小值下标每次都在变,变量存储 //    假如第一个是 ...

  10. txt 文件的归并和分割

    1.归并 import os # 1.获取需要整合的文件目录下的 filepath = "G:\\我的python\\尹成\\python基础\\day13\\详细分类\\详细地区" ...