前言


参考资源

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. Gradle 是什么

    写在前面的话,最近在系统的学习Gradle,本来想写一篇关于 Gradle 的介绍. 但在官网发现了这篇关于 Gradle 的介绍,已经介绍的很好了,我就很直接翻译过来了. 原文地址 https:// ...

  2. 浅析runtime包中的三个方法Gosched、Goexit、GOMAXPROCS

    Gosched 暂停当前goroutine,使其他goroutine先行运算.只是暂停,不是挂起,当时间片轮转到该协程时,Gosched()后面的操作将自动恢复 未使用Gosched的代码 packa ...

  3. 【入门】广电行业DNS、DHCP解决方案详解(一)——历史及现状篇

    广电发展历史 单项网络 双向网络 智能网络 广电网络现状 广电网络典型特征 接入技术混杂 承载业务多样化 业务终端错综复杂 其他 网络现状模型 总结 广电发展历史 广电就是广播电视,广电发展可以分为三 ...

  4. 如何在Python中表示一个对象

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

  5. 点击任意位置关闭(CocosCreator)

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客       今天,接触到一个新功能,当弹出某个弹框时,需要点击除弹框的剩余任意位置,来关闭该弹框,例如:当红框内 ...

  6. spring boot环境配置

    Eclipse+Maven创建webapp项目<一> 1.开启eclipse,右键new——>other,如下图找到maven project 2.选择maven project,显 ...

  7. net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 哈哈哈哈,大家好,我就是那个高产似母猪的三合,长久以来,我一直在思考,如何才能实现高效而简洁的仓储模式 ...

  8. DELPHI GDI + TGPFont UnitPixel 问题解决

    查不少资料,在 GPfont := TGPFont.Create(fontFamily, Font.Size , FontStyleRegular,UnitPixel ); 时,显示的字体,并不是按D ...

  9. 带你深入了解NPM——NPM初学者指南

    前段时间,我们邀请了我们“城内”(葡萄城)资深开发工程师刘涛为大家分享了一次干货满满的关于Electron线上公开课,在课程过程中有不少同学对于NPM的概念和用法有一些疑问,所以这次我们希望通过这篇文 ...

  10. zabbix -- 学习之一

    网上说这东西是运维必须学会的东西,于是乎捣鼓的第一步就开始了. 首先,在度娘上搜索了一下,找到了官网,按照官网的说法没操作成功.后来照这博主的帖子(https://www.cnblogs.com/xi ...