观察者模式:实现高效事件驱动编程的策略

news2024/11/23 9:25:14

在软件开发中,观察者模式是一种关键的行为型设计模式,用于建立对象间的一种依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新。这种模式是事件监听和响应编程的基石。本文将详细介绍观察者模式的定义、实现、应用场景以及优缺点。
在这里插入图片描述

1. 观察者模式的定义

观察者模式(Observer Pattern)也被称为发布-订阅(Pub-Sub)模式。在这种模式中,被称为“主题”(Subject)的对象维护一系列依赖于它的对象,称为“观察者”(Observers),主题在状态变化时通知所有观察者,以便它们能够自动更新自己。

2. 实现观察者模式

在Python中,实现观察者模式涉及创建主题和观察者两种角色的类。以下是一个观察者模式的简单实现示例:

class Subject:
    """主题,被观察者"""
    def __init__(self):
        self._observers = []

    def attach(self, observer):
        if observer not in self._observers:
            self._observers.append(observer)

    def detach(self, observer):
        try:
            self._observers.remove(observer)
        except ValueError:
            pass

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

class ConcreteSubject(Subject):
    """具体主题,状态改变时会触发通知"""
    def __init__(self, state=0):
        super().__init__()
        self._state = state

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

    @state.setter
    def state(self, value):
        self._state = value
        self.notify()

class Observer:
    """观察者基类"""
    def update(self, subject):
        pass

class ConcreteObserver(Observer):
    """具体观察者,响应通知进行自我更新"""
    def update(self, subject):
        print(f"Observer: Reacted to the change in subject's state to {subject.state}")

# 客户端代码
subject = ConcreteSubject()
observer_a = ConcreteObserver()
subject.attach(observer_a)
subject.state = 123  # 观察者会自动被通知并更新

3. 观察者模式的应用实例

观察者模式在多种场景中有用,尤其适用于:

  • 事件管理系统:在实现事件监听和通知机制时广泛使用。
  • 用户界面组件:如模型-视图-控制器(MVC)架构中的模型更新通知视图组件。
  • 分布式系统的交互:比如消息队列和事件驱动的服务。

4. 优点和缺点

优点:

  • 降低了对象间的耦合度。
  • 支持简单的通信系统,使得对象间的通信自动化和实时更新。

缺点:

  • 可能导致设计非直观。
  • 如果观察者和主题间存在循环依赖,可能导致系统行为不稳定。

5. 总结

观察者模式是实现动态和自动的通知与更新机制的有效方式,适用于处理复杂的依赖关系。通过合理使用这种模式,可以提高软件的灵活性和可维护性。

更多Python编程相关文章:cpython666.github.io

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

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

相关文章

[Classifier-Guided] Diffusion Models Beat GANs on Image Synthesis

1、介绍 针对diffusion models不如GAN的原因进行改进: 1)充分探索网络结构 2)在diversity和fidelity之间进行trade off 2、改进 1)在采样步数更少的情况下,方差设置为固定值并非最优。需要将表示为网络预测的v ​​​…

iPhone中的短信不小心删除了,使用三种方法教你怎么恢复?

在操作智能手机时,我们可能不小心误删了一些关键短信。遇到这种情况,我们该如何应对呢?小编将分享3种方法来解决这一问题。 第一种方法是利用最近删除文件夹。需要注意的是,已删除的短信在此文件夹中保存的时间最多为30天。 第二种…

第15届蓝桥杯模拟赛第一期

额。。。。提前声明水文章,题目都不难。 文章目录 1. 字母数2. 大乘积3. 星期几4.列名5. 最大连通6. 清理水域7. 信号覆盖8. 附近最小9. 第三小10. 3个111. 装苹果12. 删字母13. 统计次数14. 最小数位和15. 对折次数16. 相近分解17. 电扇控制18. 最尖位置 明天就要…

深度学习pytorch好用网站分享

深度学习在线实验室Featurizehttps://featurize.cn/而且这个网站里面还有一些学习教程 免费好用 如何使用 PyTorch 进行图像分类https://featurize.cn/notebooks/5a36fa40-490e-4664-bf98-aa5ad7b2fc2f 华为modelArtshttps://bbs.huaweicloud.com/forum/thread-76328-1-1.html…

分类算法——KNN算法(二)

什么是K-近邻算法 1KNN原理 K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法,总体来说KNN算法是相对比较容易理解的算法。 定义 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本…

厂区3D全景线上漫游体验突破现实时空阻碍

智慧园区,作为现代城市发展的重要引擎,其管理效率和安全监控的需求日益凸显。而720VR全景展示技术的引入,无疑为智慧园区的建设注入了新的活力。通过360全空间无死角的视觉展示,用户可以身临其境地感受园区的每一个角落&#xff0…

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks系列传送门 一、安装包 有需要的朋友可以私信~ 二、安装 安装挺简单 1、先安装DVD-R147826.1-1-01-vx69.udf.iso 镜像中的Setup.exe程序,记住要使用管理员权限 2、再安装DVD-R147826.1-23-00.iso 镜像中的Setup.exe程序,同样要使用管理员权限 3…

数据结构--链式栈

一.链式栈的栈顶在哪里? 二.链栈的结构: typedef struct LSNode{ int data; struct LSNode* next; }LSNode ,*PLStack; //链栈的节点.由于栈顶在第一个数据节点,所以不需要top指针 三.链式栈的实现: //初始化LSNode* p (LSNode*)malloc(sizeof(LSNode));assert(p ! NULL)…

MySQL数据库的详解(1)

DDL(数据库操作) 查询 查询所有数据库:show databases;当前数据库:select database(); 创建 创建数据库:create database [ if not exists] 数据库名 ; 使用 使用数据库:use 数据库名 ; 删除 删除数…

2024年MathorCup数模竞赛C题超详细解题思路

妈妈杯本次比赛报名队伍号高达12500,这也就意味着大概一万只队伍参加报名,仅仅在报名人数这一项,妈妈杯已经成为美赛国赛之后的第三大竞赛。C题作为本次竞赛最简单也最容易获奖的题目,本文将给大家带来手把手超详细解题思路。 注…

kali桥接校园网实现上网

1.查看校园网信息 1. vim /etc/network/interfaces 添加下列信息,地址、网关、掩码和主机一样即可 3.vim /etc/resolv.conf 添加dns解析 4.macchanger -m AA:bb:cc:DD:ee:ff eth0(改为和主机一样的mac) 5. /etc/init.d/networking restart 重启网络即可

vs2022启动cmake项目(qt+c++)

1.本工程,如图,1个cmakelist.txt3个文件 2.启动vs 3.选择文件夹 4.进入这个页面,就说明配置没问题 5.启动 6.最后会自己生成其他文件

【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框

往期回顾: 【QT入门】 Qt自定义控件与样式设计之qss选择器-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QLineEdit的qss使用-CSDN博客 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬…

木头姐最新访谈:英伟达“卖早了”没什么,新买的Coinbase涨得更好

木头姐表示,虽然英伟达在本轮AI竞赛中处于领先地位,但要证明其定价合理,还需要找到更多能够证明AI正在加速企业收入增长的证据。她仍看好特斯拉的长期前景,主要基于其在自动驾驶和人形机器人领域的领先地位。 木头姐精彩观点 我们…

外观模式:简化复杂系统的统一接口

在面向对象的软件开发中,外观模式是一种常用的结构型设计模式,旨在为复杂的系统提供一个简化的接口。通过创建一个统一的高级接口,这个模式帮助客户端通过一个简单的方式与复杂的子系统交互。本文将详细介绍外观模式的定义、实现、应用场景以…

Java 怎么捕捉 Windows 中前台窗口的改变?

在Java中捕捉Windows中前台窗口的改变通常需要使用JNI(Java Native Interface)来调用Windows API。Windows API提供了一系列函数来获取有关窗口和进程的信息,通过使用这些函数,我们可以实现在Java程序中监视和捕捉Windows前台窗口…

redux-persist

npm install redux-persist 目录:(分模块) 之前未加入持久化的代码: import { legacy_createStore as createStore } from redux import { combineReducers } from "redux"; import countReducer from ./modules/cou…

小红的白色字符串

题目描述 小红拿到了一个字符串,她准备将一些字母变成白色,变成白色的字母看上去就和空格一样,这样字符串就变成了一些单词。 现在小红希望,每个单词都满足以下两种情况中的一种: 1.开头第一个大写,其余为…

基于linux进一步理解核间通讯

芯片架构分为同构和异构: 如下图TC397: 如下图TDA4: 如下图STM32MP157: 非对称多处理结构(AMP): AMP 结构是指每个内核运行自己的 OS 或同一 OS 的独立实例&#

bugku-web-file_get_contents

<?php extract($_GET); if (!empty($ac)){$f trim(file_get_contents($fn));if ($ac $f){echo "<p>This is flag:" ." $flag</p>";}else{echo "<p>sorry!</p>";} } ?> 这里涉及到几个不常用的函数 这里直接构…