在 Python 中实现观察者模式可以遵循以下具体步骤,这些步骤清晰地划分了角色和交互流程:

步骤 1:定义主题(Subject)基类

主题是被观察的对象,负责管理观察者和发送通知。需实现以下核心方法:

  • 存储观察者的容器(如列表)
  • 添加观察者的方法(attach
  • 移除观察者的方法(detach
  • 通知所有观察者的方法(notify
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, *args, **kwargs):"""通知所有观察者状态变化"""for observer in self._observers:observer.update(*args, **kwargs)  # 调用观察者的更新方法

步骤 2:实现具体主题(ConcreteSubject)

具体主题是实际业务对象,维护自身状态,当状态变化时触发通知。

class WeatherStation(Subject):  # 继承主题基类def __init__(self):super().__init__()self._temperature = None  # 示例:温度状态@propertydef temperature(self):return self._temperature@temperature.setterdef temperature(self, new_temp):self._temperature = new_temp  # 更新状态self.notify(new_temp)  # 状态变化时通知观察者

步骤 3:定义观察者(Observer)基类/接口

观察者是接收通知的对象,需定义一个更新方法(update),供主题调用。

class Observer:def update(self, *args, **kwargs):"""接收主题通知的方法,子类必须实现"""raise NotImplementedError("子类必须重写 update 方法")

步骤 4:实现具体观察者(ConcreteObserver)

具体观察者根据自身需求实现update方法,处理主题发送的通知。

class PhoneDisplay(Observer):  # 手机显示屏观察者def update(self, temp):print(f"手机显示:当前温度 {temp}°C")class WindowDisplay(Observer):  # 窗口显示屏观察者def update(self, temp):print(f"窗口显示:温度更新为 {temp}°C")

步骤 5:使用观察者模式

创建主题和观察者实例,关联它们,并触发状态变化验证效果。

# 1. 创建主题(被观察者)
weather_station = WeatherStation()# 2. 创建观察者
phone_display = PhoneDisplay()
window_display = WindowDisplay()# 3. 注册观察者到主题
weather_station.attach(phone_display)
weather_station.attach(window_display)# 4. 改变主题状态(自动通知观察者)
print("--- 温度变为 25°C ---")
weather_station.temperature = 25print("\n--- 温度变为 30°C ---")
weather_station.temperature = 30# 5. 移除一个观察者
weather_station.detach(phone_display)
print("\n--- 移除手机显示后,温度变为 28°C ---")
weather_station.temperature = 28

执行结果

--- 温度变为 25°C ---
手机显示:当前温度 25°C
窗口显示:温度更新为 25°C--- 温度变为 30°C ---
手机显示:当前温度 30°C
窗口显示:温度更新为 30°C--- 移除手机显示后,温度变为 28°C ---
窗口显示:温度更新为 28°C

核心逻辑总结

  1. 主题与观察者解耦:主题只需知道观察者有update方法,无需了解其具体实现;观察者也无需知道主题的内部逻辑。
  2. 动态关联:通过attachdetach可以随时添加/移除观察者,灵活性高。
  3. 自动通知:主题状态变化时,主动调用所有注册观察者的update方法,实现"一处变化,多处响应"。

这种模式适用于事件监听、状态同步、发布-订阅系统等场景,例如 GUI 中的按钮点击事件、数据更新通知等。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式方案 一 分布式锁的四大实现方式

Java分布式锁实现方式详解 什么是分布式锁 基于数据库的分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁基于Etcd的分布式锁 各种实现方式对比最佳实践建议多节点/线程调用结果展示 基于数据库的分布式锁 - 多线程测试基于Redis的分布式锁 - 多节点测试基于ZooKeeper的分…

基于Room+RESTful的双权限Android开机时间监控方案

概述 以下是使用Kotlin实现的商业级Android开机时间记录功能,包含现代Android开发最佳实践。 系统架构 组件设计 // BootReceiver - 接收开机广播 class BootReceiver : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent?) {if (int…

水库大坝安全监测系统的作用

水库大坝作为重要的水利基础设施,承担着防洪、供水、发电、灌溉等多重功能,其安全性直接关系到人民生命财产安全和社会经济发展。然而,由于自然环境变化、材料老化、荷载作用以及人为因素的影响,大坝在长期运行过程中可能出现裂缝…

《Kubernetes 构建 MySQL MGR 集群实战教程》

#### 一、前言 MySQL Group Replication (MGR) 是 MySQL 官方提供的高可用集群方案,基于 Paxos 协议实现多节点数据强一致性。本教程将指导如何在 Kubernetes 上部署 MySQL MGR 集群,适用于生产级高可用场景。---#### 二、环境准备 1. **Kubernetes 集…

影视APP源码 SK影视 安卓+苹果双端APP 反编译详细视频教程+源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 影视APP源码 SK影视 安卓苹果双端APP 反编译详细视频教程源码 自带对接优效SDK广告(已失效)。域名和IP都可以搭建。 自带一起看和短剧页面功能,三种…

pyqt+python之二进制生肖占卜

目录 一、引言 二、GUI界面设计 1.效果演示 2.相关提示 3.界面设计.py 三、主要程序详解 1.导入相关模块 2.初始化设置 3.组内判断 4.猜测过程 四、总程序代码 一、引言 在数字时代,传统文化与编程语言的碰撞总能迸发奇妙火花。本项目以PyQtPython为技术…

人工智能-python-深度学习-经典网络模型-LeNets5

文章目录LeNet-5(详解)—— 从原理到 PyTorch 实现(含训练示例)简介LeNet-5 的核心思想LeNet-5 逐层结构详解逐层计算举例📌 输入层📌 C1 卷积层📌 S2 池化层📌 C3 卷积层&#x1f4…

机器视觉的手机柔性屏贴合应用

在智能手机制造领域,柔性屏逐渐成为智能手机的主流选择,柔性屏因其轻便、易于弯曲的特性,已成为现代电子设备的重要组成部分,但同时也带来了前所未有的制造挑战。柔性屏与传统刚性玻璃屏有本质区别,它容易形变&#xf…

贪心算法应用:数字孪生同步问题详解

Java中的贪心算法应用:数字孪生同步问题详解 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。下面我将全面详细地讲解贪心算法在数字孪生同步问题中的应用。…

UOS20系统安装与 SSH/XRDP 远程访问功能配置指南

UOS20系统安装与 SSH/XRDP 远程访问功能配置指南 一、UOS 20 系统安装​ ​1. 下载系统镜像​ 访问统信官网下载 UOS 20 专业版镜像(推荐适配当前硬件的版本): https://www.chinauos.com/resource/download-professional 2. 系统安装与硬件配…

【Python】S1 基础篇 P5 字典模块指南

目录字典的本质与底层实现基础语法结构使用字典访问字典中的值添加键值对修改字典中的值删除键值对使用 get() 来访问值遍历字典遍历所有键值对遍历字典中的所有键遍历字典中的所有值嵌套字典列表在字典中存储列表字典(Dictionary)是Python中灵活且强大的…

计算机视觉之多模板匹配

简介 计算机视觉第一课opencv(四)保姆级教学 之前说过模糊匹配只是对于单个目标进行匹配,今天我们就来学习一下如何对多个目标进行匹配 一、多目标匹配 对于这个图片我们要匹配下面那个箭头,我们可以发现图中是有两个位置相同的…

封装日期选择器组件,带有上周,下周按钮

ui图组件代码如下&#xff1a; <template><div><el-date-pickerv-model"dateRange"type"daterange"align"right"size"mini":editable"false"unlink-panelsrange-separator"至"start-placeholder&q…

基于SpringBoot+MYSQL开发的AI智能大数据医疗诊断平台

角色&#xff1a; 管理员、医生、居民 技术&#xff1a; SpringBoot、MyBatis、MySQL、Shiro、Beetl、Swagger、jQuery、Bootstrap 核心功能&#xff1a; 这是一个基于SpringBoot的社区医疗管理平台&#xff0c;旨在为管理员提供用户、角色、部门、菜单、日志等系统管理功能&am…

【MFC 小白日记】对话框编辑器里“原型图像”到底要不要勾?3 分钟看懂!

摘要&#xff1a;本文解析了MFC中Picture Control的"原型图像(Prototype Image)"属性的真实作用。该属性仅在设计时提供可视化的占位图预览&#xff0c;方便UI布局&#xff0c;运行时不会影响程序表现。文章通过对比实验验证&#xff0c;勾选后会在对话框编辑器中显示…

微信开放平台第三方平台,可以管理多个微信小程序

大家好&#xff0c;我是小悟。 这个系统可以帮助服务商更好地管理多个商家小程序&#xff0c;无需管理多个商家小程序的账号密码或者appId和secret&#xff0c;大大提升效率。 不需要频繁登录小程序后台就能完成上传代码、认证、备案、提交代码审核、发布小程序等操作。 这里录…

Java全栈学习笔记32

-- drop table t_stu;-- unique 唯一约束的列允许为null-- 如果在之后的操作中。需要某列必须为key&#xff0c;才能做一些操作的情况下。也可以使用唯一约束代替主键约束-- create table t_stu(-- studId int,-- tel varchar(11) unique,-- sex varchar(1),-- addr va…

linux升级系统,重启出现Minimal BASH-like line editingis supported

文章目录一.问题背景二.解决步骤2.1确认系统分区2.2手动引导2.3 重建grub引导2.4 还原软件包 一.问题背景 闲来无事&#xff0c;把ubuntu25.04通过sudo do-release-upgrade命令升级到了ubuntu25.10.在升级的过程会出现以下问题 1.自动替换flatpak程序为snap2.请求是否清除旧依赖…

type(类型别名)和 interface的区别和最佳实践

核心结论在大多数情况下&#xff0c;它们可以互换使用&#xff0c;都能描述对象的结构。它们的区别更多在于设计和扩展能力上。主要区别总结表特性interface (接口)type (类型别名)扩展方式使用 extends 继承interface A extends B {}使用 & 交叉类型type A B & C合并…

vscode中使用git、githup的基操

一、git提交 配置账户密码 查看用户信息 git config --global user.name # 查看用户名 git config --global user.email # 查看邮箱账户配置 # 设置全局用户名和邮箱 git config --global user.name "你的用户名" git config --global user.email "你的邮箱&q…