Python编码系列—Python观察者模式:实现事件驱动架构的利器

news2024/11/15 17:37:52

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 原理
  • 3. 使用场景
  • 4. 代码样例
  • 5. 实际应用案例
  • 6. 总结

1. 背景介绍

在现代软件架构中,事件驱动模型越来越受到青睐。观察者模式(Observer Pattern)是实现事件驱动架构的一种非常重要的设计模式。它定义了对象之间的一对多依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。本文将深入探讨Python中的观察者模式,包括其背景、原理、使用场景、代码实现和实际应用案例。

观察者模式是一种行为型设计模式,用于建立一个发布-订阅机制,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,所有观察者都会得到通知。
在这里插入图片描述

2. 原理

观察者模式的核心原理包括:

  • 定义观察者接口:观察者需要实现一个更新接口,用于接收来自主题的通知。
  • 定义主题接口:主题包含相关观察者对象的列表,提供添加、删除和通知观察者对象的方法。
  • 实现具体观察者:具体观察者实现观察者接口,完成具体更新逻辑。
  • 实现具体主题:具体主题实现主题接口,维护观察者列表,并在状态变化时通知所有观察者。

观察者模式是一种广泛应用于软件设计中的行为型模式,它通过建立一对多的依赖关系,使得一个对象的状态变化能够自动通知所有依赖于它的对象。下面详细探讨观察者模式的核心原理:

定义观察者接口
观察者接口是观察者模式的基础,它定义了一个更新方法,用于接收来自主题的通知。这个接口确保所有的观察者都能够以一致的方式响应主题的变化。通过这个接口,观察者可以实现自己的逻辑来处理通知,从而实现不同的行为。

class Observer(ABC):
    @abstractmethod
    def update(self, message):
        """接收主题的通知"""
        pass

在这个例子中,Observer类定义了一个update方法,所有具体观察者都需要实现这个方法,以便在主题状态变化时接收通知。

定义主题接口
主题接口是观察者模式中的另一个关键组成部分,它维护了一个观察者对象的列表,并提供添加、删除和通知观察者的方法。主题接口的设计使得客户端可以轻松地管理观察者的注册和注销,确保观察者能够及时接收到主题的状态变化。

class Subject(ABC):
    def __init__(self):
        self._observers = []

    def register(self, observer: Observer):
        """添加观察者"""
        self._observers.append(observer)

    def unregister(self, observer: Observer):
        """移除观察者"""
        self._observers.remove(observer)

    def notify(self, message):
        """通知所有观察者"""
        for observer in self._observers:
            observer.update(message)

在这个例子中,Subject类维护了一个观察者列表,并提供了registerunregisternotify方法,允许观察者的动态管理。

实现具体观察者
具体观察者类实现了观察者接口,并定义了在接收到通知时的具体逻辑。每个具体观察者可以根据自己的需求来处理来自主题的通知。这种设计使得不同的观察者可以有不同的响应行为,从而实现灵活的系统扩展。

class ConcreteObserver(Observer):
    def update(self, message):
        print(f"Observer received message: {message}")

在这个例子中,ConcreteObserver实现了Observer接口,并在update方法中定义了如何处理通知。

实现具体主题
具体主题类实现了主题接口,维护观察者列表,并在状态变化时通知所有观察者。具体主题类通常会包含一些状态属性,当这些状态发生变化时,它会调用notify方法来通知所有注册的观察者。

class ConcreteSubject(Subject):
    def __init__(self):
        super().__init__()
        self._state = None

    @property
    def state(self):
        return self._state

    @state.setter
    def state(self, value):
        self._state = value
        self.notify(f"State changed to {value}")

在这个例子中,ConcreteSubject类实现了状态的管理,并在状态变化时调用notify方法,确保所有观察者都能及时收到更新。

通过这些核心原理,观察者模式实现了对象之间的解耦,使得主题和观察者之间的交互变得灵活而高效。这种模式在许多实际应用中都非常有用,尤其是在需要实现事件驱动机制的场景中。

3. 使用场景

观察者模式适用于以下场景:

  • 事件多播:当一个对象的状态变化,需要同时通知多个对象时。
  • 事件驱动模拟:在模拟事件驱动系统时,如用户界面、游戏、传感器系统中。
  • 实现分布式事件处理系统:在需要实现事件的发布和订阅机制时。

4. 代码样例

以下是一个Python中实现观察者模式的示例:

class Observer:
    def update(self, message):
        pass

class ConcreteObserver(Observer):
    def update(self, message):
        print(f"Observer: {message}")

class Subject:
    def __init__(self):
        self._observers = []

    def register(self, observer):
        self._observers.append(observer)

    def unregister(self, observer):
        self._observers.remove(observer)

    def notify(self, message):
        for observer in self._observers:
            observer.update(message)

class ConcreteSubject(Subject):
    def __init__(self):
        super().__init__()
        self._state = None

    @property
    def state(self):
        return self._state

    @state.setter
    def state(self, value):
        self._state = value
        self.notify(f"State changed to {value}")

# 客户端代码
if __name__ == "__main__":
    subject = ConcreteSubject()
    observer_a = ConcreteObserver()
    observer_b = ConcreteObserver()

    subject.register(observer_a)
    subject.register(observer_b)

    subject.state = "active"
    subject.unregister(observer_a)

    subject.state = "inactive"

5. 实际应用案例

假设我们正在开发一个新闻发布系统,当新闻发布时,需要通知所有订阅者。我们可以使用观察者模式来实现这一需求。

class NewsPublisher(Subject):
    def publish_news(self, news):
        self.state = news
        self.notify(f"News published: {news}")

class NewsSubscriber(Observer):
    def update(self, message):
        print(f"NewsSubscriber received news: {message}")

# 客户端代码
if __name__ == "__main__":
    publisher = NewsPublisher()
    subscriber_a = NewsSubscriber()
    subscriber_b = NewsSubscriber()

    publisher.register(subscriber_a)
    publisher.register(subscriber_b)

    publisher.publish_news("Python Observer Pattern")
    publisher.publish_news("Design Patterns in Python")

6. 总结

观察者模式是一种非常实用的设计模式,它通过定义观察者和主题的接口,实现了对象之间的一对多依赖关系。这种模式在实现事件驱动架构时非常有用,如新闻发布系统、用户界面更新等场景。

设计模式是软件设计中的艺术,观察者模式作为其中的一种,为我们提供了一种高效的方式来实现事件驱动的系统。希望本文能够帮助你在Python项目中更好地应用观察者模式,提升代码的质量和灵活性。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2160318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数字ic自整资料】SV约束constraint

参考链接: SV--随机约束(一)_sv constraint-CSDN博客 SV--随机约束(二)_sv constraint f循环-CSDN博客 [SV]Constraint 遇到的问题_父类和子类 constraint-CSDN博客 目录 1、随机化的概念理解 2、约束(constrain…

基于报位时间判断船舶设备是否在线,基于心跳时间判断基站网络是否在线

文章目录 引言I 在线船舶查询在线或者离线船舶显示在线状态统计在线船舶II 树状显示船舶设备数据结构统计船舶设备在线数和总数III 基站网络是否在线IV 知识扩展统计某个key的数据,例如统计船舶分类下的在线船舶MyBatis引言 本文采用的数据库是SQL Server,开发语言为Java。 …

无线协议wlan在华为模拟器中的实现

无线技术 wifi6:标准为802.11; wifi发展趋势: vlan基本概念: wlan组网架构: 1)fat胖AP;能够独立工作,可以单独配置;小型网络使用,功能少; 2)fit瘦APAC:适用大型网络…

《深度学习》—— PyTorch的介绍及PyTorch的CPU版本安装

文章目录 一、PyTorch的简单介绍二、pytorch的CPU版本安装三、 torch、torchvision、torchaudio 三个库的介绍 一、PyTorch的简单介绍 PyTorch是一个由Facebook AI实验室开发的深度学习框架,它基于Python,并提供了高效的GPU加速和灵活的模型定义能力。1…

基于vue框架的传统服饰剪裁交流平台5m953(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,服装分类,服装资讯 开题报告内容 基于Vue框架的传统服饰剪裁交流平台开题报告 一、研究背景与意义 随着全球化进程的加速,文化多样性的保护与传承日益受到重视。传统服饰作为各民族历史文化的瑰宝,不仅承载…

阅读记录:Gradient Episodic Memory for Continual Learning

1. Contribution 提出了一组指标来评估模型在连续数据上的学习情况。这些指标不仅通过测试准确性来表征模型,还通过其跨任务迁移知识的能力来表征模型。针对持续学习任务,提出了GEM模型(Gradient Episodic Memory),它…

C++中stack类和queue类

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步 数据结构习题_LaNzikinh篮子的博客-CSDN博客 初阶数据结构_LaNzikinh篮子的博客-CSDN博客 收入专栏:C_LaNzikinh篮子的博客-CSDN博客 其他专…

基于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度呢

关于MT79815G CPE 板子上挂usb3.0的5G 模块,WIFI能跑多少速度的问题,我们以启明智显 ZX7981P智能无线接入型路由器(CPE)挂广合通5G模组为例说明: 一般来说,用 ZX7981P,通过软加速,U…

Java:列表操作

目录 1、判断列表是否为空或者为NULL2、列表包含3、列表排序4、列表截取5、列表合并6、列表求极值7、列表转字符串8、列表去重的四种方式9、列表转数组 1、判断列表是否为空或者为NULL Optional.ofNullable(list).orElse(Collections.emptyList()).isEmpty() // true为空或NU…

【JAVA-数据结构】时间空间复杂度计算案例

接着上一篇文章&#xff0c;对应举一些例子。 1.时间复杂度 【实例1】 // 计算func2的时间复杂度&#xff1f; void func2(int N) {int count 0;for (int k 0; k < 2 * N ; k) {count;} int M 10;while ((M--) > 0) {count;} System.out.println(count); } 基本操作…

在云渲染中3D工程文件安全性怎么样?

在云渲染中&#xff0c;3D工程文件的安全性是用户最关心的问题之一。随着企业对数据保护意识的增强&#xff0c;云渲染平台采取了严格的安全措施和加密技术&#xff0c;以确保用户数据的安全性和隐私性。 云渲染平台为了保障用户数据的安全&#xff0c;采取了多层次的安全措施。…

电子信息制造业数据安全如何防护?有什么加密方案?

电子信息制造业数据加密解决方案 问题 1.电子文档&#xff08;源代码、设计图纸、设计方案等&#xff09;均要做数据保护措施&#xff0c;防止内部人员有意或无意造成数据泄露&#xff1b; 2.与外部企业之间往来的外发文件&#xff0c;管控不当&#xff0c;容易造成泄密&…

工业能源物联网的建设与维护该如何实现

随着全球对可持续发展的重视&#xff0c;智能电网和微电网的应用逐渐成为能源转型的重要方向。在新型电力系统中&#xff0c;负荷侧资源不再是单纯消耗的“消费者”&#xff0c;而是既消耗电能又可生产电能的“产消者”。比如&#xff0c;电力用户利用屋顶建设光伏发电&#xf…

防火墙详解(二)通过网页登录配置华为eNSP中USG6000V1防火墙

配置步骤 步骤一 打开eNSP&#xff0c;建立如下拓扑。防火墙使用&#xff1a;USG6000V1。 Cloud的作用是通过它可以连接本地的网卡&#xff0c;然后与我们的电脑进行通信。 由于防火墙USG6000V&#xff0c;不能直接开启&#xff0c;需要的导入包&#xff0c;所以需要在华为官网…

可视挖耳勺神器怎么样?可视耳勺热销第一名品牌!

耳道作为我们身体的重要部分&#xff0c;它的清洁健康很重要。传统挖耳勺的材质偏硬、表面摩擦力大并且在不可视的情况下进行盲目掏耳&#xff0c;很容易出现刮伤耳道肌肤导致耳朵出血感染等意外。而网上出现了一种新型的掏耳神器--可视耳勺&#xff0c;它到底怎么样&#xff1…

Java语言程序设计基础篇_编程练习题**18.38 (递归树)

目录 题目&#xff1a;**18.38 (递归树) 代码示例 代码逻辑解释 类定义和变量初始化 main 方法 start 方法 drawRecursiveTree 方法 输出结果 题目&#xff1a;**18.38 (递归树) 编写一个程序来显示一个递归树&#xff0c;如图18-20所示 代码示例 编程练习题18_38Re…

Python模块和包:自定义模块和包③

文章目录 一、模块1.1 什么是模块1.2 创建模块1.3 导入模块1.4 模块的命名空间 二、包2.1 什么是包2.2 创建包2.3 导入包2.4 包的命名空间 三、综合详细例子3.1 项目结构3.2 模块代码student.pycourse.pymanager.py 3.3 主程序代码main.py 3.4 运行结果 四、总结 Python模块和包…

regPractice-正则表达式练习

正则表达式练习(java) 1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在8-10之间。 ^(?.*\d)(?.*\[a-z])(?.*[A-Z])[a-zA-Z\d]{8,10}$**(?pattern)**属于正向前瞻断言 正向前瞻断言的语法是 (?pattern)&a…

Android开发不用存储权限进行拍照

Android开发不用存储权限进行拍照 有时平台审核严&#xff0c;拍照时不能获取存储。这怎么办呢&#xff0c;拍照功能又不能去掉。 一、思路&#xff1a; 得自定义Camera&#xff0c;然后把拍照图片存在app目录下&#xff0c;再刷新到手机相册 二、效果图&#xff1a; Andro…

31省市农业地图大数据

1.北京市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 2.天津市 谷类作物种植结构&#xff08;万亩&#xff09; 农作物种植结构&#xff08;万亩&#xff09; 3.黑龙江省 谷类作物种植结构&#xff08;万亩&#xff09; 农作物…