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

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

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

🔍 技术导航:

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

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

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

文章目录

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

1. 背景介绍

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

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

2. 原理

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

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

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

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

class Observer(ABC):@abstractmethoddef 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@propertydef state(self):return self._state@state.setterdef state(self, value):self._state = valueself.notify(f"State changed to {value}")

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

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

3. 使用场景

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

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

4. 代码样例

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

class Observer:def update(self, message):passclass 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@propertydef state(self):return self._state@state.setterdef state(self, value):self._state = valueself.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 = newsself.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.xdnf.cn/news/148946.html

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

相关文章

ComfyUI新版本提升效率小技巧(建议收藏)

原文链接:建议收藏!ComfyUI提升效率的小技巧,肯定有你不知道的 (chinaz.com) 本篇带来ComfyUI非常实用的9个小技巧,可以提升我们的ComfyUI工作效率,建议大家收藏起来哈 新版中文搜节点 点击设置 comfy→搜索框框架…

PHP判断微信或QQ访问

PHP判断微信或QQ访问 若是微信或者QQ打开&#xff0c;提示图会覆盖网页&#xff0c;但网页功能仍在运行&#xff01; <meta name"viewport" content"initial-scale1, maximum-scale1, user-scalableno, widthdevice-width"><style> .top-gui…

OpenCV目标检测(1)模板匹配函数matchTemplate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个模板与重叠的图像区域进行比较。 该函数在图像中滑动&#xff0c;使用指定的方法将大小为 w h w \times h wh的重叠块与模板 templ 进行…

基于python+django+vue的旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【Canvas与诗词】铁马冰河入梦来

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金红圈铁马冰河入梦来</title><style type"text/css&q…

【linux经典工具】strace-就十分钟你也能成为性能调优专家

strace 是什么 strace是一款功能强大的 Linux 进程监控和诊断工具。主要作用就是&#xff1a;用于调试程序、解决问题、拦截和记录系统调用以及跟踪正在运行的进程。它能输出了程序如何与系统交互的过程&#xff0c;尤其是在无法获取源代码的情况下&#xff08;那些开源工具、…

召回04 离散特征的处理

推荐系统会将一个id映射成一个向量 Qne-Hot编码 Embedding(嵌入)&#xff1a; 把每个类别映射成一个低维的稠密向量

k均值算法 聚类算法 k-means

首先我们导入科学计算的库 import numpy as np import matplotlib.pyplot as plt直接我们生成一组数据&#xff0c;为了保证每次的数据是一致的&#xff0c;我们设置一个随机种子。 np.random.seed(0) Xnp.random.rand(100,2) print(X) 结果 然后我们就要开始写K-means算…

光控资本:红利税是什么?一万股票的红利税是多少?

盈利税&#xff0c;即股息盈利税&#xff0c;是投资者卖出分红的股票时&#xff0c;需求扣除的税&#xff0c;一般来说&#xff0c;投资者卖出分红股票之后&#xff0c;不会立马扣税&#xff0c;在投资者卖出股票的第2个生意日至31个工作日之间进行补缴。一万股票的盈利税盈利税…

VMware Workstation 17.5安装教程

目录 软件介绍 1、下载安装包 2、安装虚拟机 3、卸载虚拟机 软件介绍 VMware&#xff08;虚拟机&#xff09;是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;通过它可在一台电脑上同时运行更多的Microsoft Windows、Linux…

LibJPEG库使用_通过LibJPEG将RGB数据保存为JPG图片存储到磁盘

一、前言 LibJPEG库是一个广泛使用的开源C库&#xff0c;用于处理JPEG图像的压缩和解压缩。该库由独立JPEG小组&#xff08;Independent JPEG Group, IJG&#xff09;开发&#xff0c;提供了功能强大的API&#xff0c;用于创建和读取JPEG文件。LibJPEG库支持JPEG的所有常见功能…

哈希——字符串哈希

回顾/本期梗概 上期我们学习了图论基础&#xff08;空降链接&#xff09;&#xff0c;本期我们将学习哈希中的字符串哈希。 1、什么是哈希 哈希算法是&#xff1a;通过哈希函数讲字符串、较大的数等转换为能够用变量表示的或者是直接能作为数组下标的数&#xff0c;通过哈希算法…

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

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

专业120+总分400+中国科学技术大学843信号与系统考研经验中科大电子信息通信工程,生物医学工程,苏医工,真题,大纲,参考书。

经过将近一年的复习备考&#xff0c;专业843信号与系统120&#xff0c;总分400&#xff0c;顺利上岸朝思暮想的中科大。总结一些自己的备考经验&#xff0c;希望能给大家一些参考&#xff0c;少走弯路。首先讲一下大家最关注的专业课&#xff1a;843信号与系统 中科大843专业课…

kafka集群架构与原理

前言 这次我们从消息队列开始讨论。生产者-消费者模型中间需要一个消息队列&#xff0c;以存储生产者的产品。对传统的消息队列来说&#xff0c;它支持点对点&#xff08;P2P&#xff09;和发布/订阅&#xff08;Pub/Sub&#xff09;两种消息模型。在点对点模型中&#xff0c;消…

OpenCV_自定义线性滤波(filter2D)应用详解

OpenCV filter2D将图像与内核进行卷积&#xff0c;将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时&#xff0c;该函数根据指定的边界模式插值异常像素值。 卷积核本质上是一个固定大小的系数数组&#xff0c;数组中的某个元素被作为锚点&#xff08;一般…

使用vite+react+ts+Ant Design开发后台管理项目(四)

前言 本文将引导开发者从零基础开始&#xff0c;运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术…

SAP B1 认证考试习题 - 基础主数据(解析版)

感谢投喂*罒▽罒* 一、基础 1. 下列哪个产品不是以中小型企业为目标客户的 A. mySAP All-in-One B. SAP Business One C. mySAP Business Suite 答案&#xff1a;C 解析&#xff1a;SAP Business One -- 为小型企业定制的解决方案&#xff08;250人以下&#xff09;&…

【论文】FunAudioLLM:一个旨在增强人类与大型语言模型(LLMs)之间自然语音交互的模型家族

研究背景 1.研究问题&#xff1a;这篇文章要解决的问题是如何增强人类与大型语言模型&#xff08;LLMs&#xff09;之间的自然语音交互。具体来说&#xff0c;研究集中在语音识别、情感识别和音频事件检测&#xff08;多语言&#xff09;以及语音生成&#xff08;多语言、零样…

Python模拟真人鼠标轨迹

一.API跨语言平台支持 鼠标轨迹API 底层实现采用 C/C 语言&#xff0c;利用其高性能和系统级访问能力&#xff0c;开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL&#xff08;动态链接库&#xff09;&#xff0c;可以方便地在不同的编程环境中调用&#xff0c;实现跨语言…