[Design Patterns] 03. Behavioral Patterns - Observer Pattern
前言
参考资源
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的更多相关文章
- 【设计模式】行为型03观察者模式(Observer Pattern)
		
记得16年初第一次学习了23种设计模式,但是除了少数几个简单的外,其他的很多都是学了个似懂非懂,以至于有人问起甚至说不上来,现在想想,其实就是没看懂而已.例如观察者模式,其实原理很简单,但是当时并没有 ...
 - Learning JavaScript Design Patterns The Observer Pattern
		
The Observer Pattern The Observer is a design pattern where an object (known as a subject) maintains ...
 - [Design Pattern] Observer Pattern 简单案例
		
Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...
 - Design Pattern: Observer Pattern
		
1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...
 - 深入浅出设计模式——观察者模式(Observer Pattern)
		
模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...
 - Observer Pattern
		
Motivation We can not talk about Object Oriented Programming without considering the state of the ob ...
 - 设计模式(二)The Observer Pattern 观察者模式
		
问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新 ...
 - 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
		
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
 - 设计模式 - 观察者模式(Observer Pattern) 详细说明
		
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
 
随机推荐
- JAVA开发奇淫巧技(一)
			
本章节持续收录常用且好用的IDE开发工具,基于myeclipse 1.Lombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网:http://projectlo ...
 - SpringMVC源码分析6:SpringMVC的视图解析原理
			
title: SpringMVC源码分析6:SpringMVC的视图解析原理 date: 2018-06-07 11:03:19 tags: - SpringMVC categories: - 后端 ...
 - 七缸发动机预热,docker swarm + .net core 高速飙车成功
			
(图片来源:Microsoft Blog) 上周五上午在我们将 .net core 博客站点由 docker swarm 自动驾驶改为 docker-compose 手动驾驶后,依然发生了翻车,意料之 ...
 - nodeJS 中mongoose操作分页
			
开始前先聊聊五毛钱的: 好久没写了,可能是因为懒(哎),写这个是好事,既帮助了自己,巩固一下知识,也可以让别人给自己纠错纠错,三月份接触到了node,先是跟着一些教程写了一些小实例,感觉自己就喜欢上了 ...
 - JMeter用户参数
			
压测的时候,经常需要使用动态参数,即每次请求的参数不一样,这样才能更好的模拟真实的用户请求,我们首先能想到的也是最常见的就是用户ID 1. 用户参数 我们可以定义一个变量,然后指定多个值,这样每次请 ...
 - 关于line-height 行高的一些理解和技巧
			
大家都知道,如何设置文字垂直居中,也就是:设置line-height 和 外围盒子的高度height一致: 其实这里有个地方,是多余的,也就是height,设不设置都居中: 那么,行高是生产高度的? ...
 - 人员考勤,MySQLl数据库一个表自动生成3表筛选人员迟到早退缺勤
			
前言:漂亮的人事小姐姐找我帮忙弄考勤:由于人员考勤和门禁一起,打卡记录太多,打卡机只能导出一个打卡Excel总表,不容易人工筛选. Excel表的格式是这样的:(这里101代替真实人名) 实现目标: ...
 - 17_defer(延迟调用)关键字的使用
			
1.defer是延迟调用关键字,只能在函数内部使用 2.总是在main函数结束前调用(和init用法相对) 3.如果有多个defer 遵循先进后出的原则 4.和匿名函数同时使用时,如果匿名函数带有参数 ...
 - office web apps server安装
			
1.准备服务器 准备一台windows server 2012 R2服务器,修改计算机名称加入域,如果是通过虚拟机复制导致sid冲突,可以先运行 c:\windows\system32\sysprep ...
 - 牛客暑假多校第二场 F trade
			
题意: 白兔有n个仓库,每个仓库有啊ai个货物,在每个仓库白兔可以装上任意数量的货物,也可以卸下任意数量的货物,现在有k个圆形信号阻隔器,然后有m个顾客下个一个订单,每个顾客的收货量有一个上限, 在每 ...