前言


参考资源

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.

最新文章

  1. 工作邮件loop的用法
  2. CSS选 择器 三种样式
  3. WM_COPYDATA实现的不同进程间通信
  4. Flume组件source,channel,sink源码分析
  5. easyui-datagrid连接数据库实现分页查询数据
  6. 使用ultraiso制作启动盘
  7. DampView阻尼效果
  8. 基于51单片机+DAC0832的信号发生器
  9. .Net自帶Ajax和GridView
  10. MATLAB时间序列预测Prediction of time series with NAR neural network
  11. Codeforces Round #197 (Div. 2) C,D两题
  12. HW5.6
  13. IN改写关联注意事项!
  14. 使用NPOI写入Excel数据(ASP.NET)
  15. java中split分割"."的问题
  16. windows粘贴板操作-自己的应用和windows右键互动
  17. 【翻译】asp.net core中使用MediatR
  18. Vue.js 技术揭秘(学习) slot
  19. cece
  20. ViewBag & ViewData

热门文章

  1. luoguP2444_[POI2000]病毒
  2. idea设置docker远程插件
  3. FIS 插件机制
  4. Okhttp3源码解析(4)-拦截器与设计模式
  5. Istio 太复杂?KubeSphere基于Ingress-Nginx实现灰度发布
  6. 装饰器修复技术@wraps
  7. Leetcode之二分法专题-441. 排列硬币(Arranging Coins)
  8. 学会spss就能找到数据分析工作吗
  9. netcore 中的动态代理与RPC实现(微服务专题)
  10. Mysql分区实战