[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.

posted @   郝壹贰叁  阅读(171)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示