Python示例解释观察者模式

观察者模式是一种常用的设计模式,用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。下面通过一个简单的例子来解释观察者模式的概念。

假设我们有一个名为"主题"(Subject)的类,它负责存储一些数据,并且当数据发生变化时需要通知相关的观察者。同时,我们还有一些观察者对象,它们关注主题的数据变化,并根据变化做出相应的响应。

首先,我们定义一个观察者接口(Observer),其中包含一个更新(update)的方法,用于接收主题发出的通知。观察者类将实现这个接口,具体的观察者对象将根据自己的需求定义如何响应主题的通知。

# 观察者接口
class Observer:def update(self, data):pass

然后,我们定义主题类(Subject),它包含一个观察者列表,负责管理观察者对象并在数据变化时通知它们。

# 主题类
class Subject:def __init__(self):self.observers = []def attach(self, observer):self.observers.append(observer)def detach(self, observer):self.observers.remove(observer)def notify(self, data):for observer in self.observers:observer.update(data)

现在,我们可以创建具体的观察者类(具体观察者),实现它们自己的更新逻辑。

# 具体观察者类
class ConcreteObserver(Observer):def update(self, data):print("Received data:", data)# 根据数据变化做出相应的响应操作

最后,我们可以使用这些类来演示观察者模式的工作原理。

# 创建主题对象
subject = Subject()# 创建观察者对象
observer1 = ConcreteObserver()
observer2 = ConcreteObserver()# 将观察者对象注册到主题中
subject.attach(observer1)
subject.attach(observer2)# 数据发生变化,通知观察者
subject.notify("Hello World!")

在上述例子中,主题对象(Subject)包含了观察者列表,并提供了用于注册、注销和通知观察者的方法。观察者对象(ConcreteObserver)实现了观察者接口,定义了如何响应主题的通知。当主题对象的数据发生变化时,它会遍历观察者列表,并调用每个观察者对象的更新方法。

通过观察者模式,我们可以实现对象之间的解耦,主题对象和观察者对象可以独立变化,互相不影响。主题对象只关注通知观察者,而观察者对象只关注它们所需的数据变化。这样的设计模式使得程序更加灵活和可扩展。

在这里插入图片描述

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

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

相关文章

【IMX6ULL驱动开发学习】20. input子系统(按键实现ls命令)

一、input子系统相关结构体 二、input子系统实例实现: static struct input_dev *key_input;static void my_timer_handle(unsigned long data) {....../* 5.input子系统上报事件 *///第三个参数要变,如果两次上报value相同,则input子系统不会…

【项目管理】成本管理

一.成本管理的概述 在项目上对成本进行管理和控制是为了让项目经理真正了解完成项目所需要消耗的时间和所需要的资源,从而对其进行相应的成本控制。成本管理主要分成以下三个方面的内容: 二.成本估算 成本估算是对整个项目投入的各种资源的成本进行估算&…

java每日一题:手动触发垃圾回收(GC)

面试官: 首先,我想问一下,你能向我解释一下"手动触发Java垃圾回收"的过程吗?🤔 面试者: 在Java中,垃圾回收是自动进行的,由Java虚拟机(JVM)负责管理。但是,有…

30多个小程序一键发布——miniprogram-ci

概述 miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。 开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。 miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览&#xff0…

Flutter底部导航BottomNavigationBar

Flutter底部导航BottomNavigationBar 主要代码: bottomNavigationBar: BottomNavigationBar(//选中菜单颜色fixedColor: Colors.red,//图标大小,默认24.0iconSize: 30,//第几个菜单选中currentIndex: currentIndex,//当item数量大于3个时需要设置type属…

simulink 结构体 bus creator

目录 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Concatenate 结构体数据存文件 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Co…

方便的记事本app有哪些 快捷方便的生活记事软件推荐

生活中很多时候都需要记事,比如去超市要买的物品清单,旅行时遇到的好看的风景、有趣的事情,以及脑海中不经意间产生的灵感、想法或思考感悟等,都可以随手用记事App软件记录下来,以便后续查看。那方便的记事本app有哪些…

计算机网络-网络层上篇

目录 一、网络层概述 二、网络层提供的两种服务 (一)面向连接的虚电路服务 (二)无连接的数据报服务 (三)虚电路服务与数据报服务的比较 三、IPv4地址及其应用 (一)IPv4地址概…

构建WebRTC技术需要的后端服务

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不是…

JS相关介绍

1.JS引入: 内部:直接在html文件内部使用script标签调用 外部:另外新建JS文件,再在html文件中调用 2.输入输出: 输入:prompt(请输入您的姓名:) 输出:document.write(你们真是天才) 注…

Nginx代理nginx.conf配置——反向代理(对WebSocket支持)

一、需求说明 基于Nginx代理nginx.conf配置——反向代理,如果要添加websocket支持,需要进行如下配置 二、配置内容 在http中添加一下配置,添加对websocket支持 http {# 配置其它内容map $http_upgrade $connection_upgrade {default upgra…

开心档之CSS 测验

目录 CSS 测验 CSS 测验 CSS测验是一种衡量前端开发人员对CSS的熟练程度的测试。通过CSS测验,可以评估一个人对CSS语言的掌握程度和应用能力,帮助公司或招聘方挑选合适的人才。下面将介绍如何进行CSS测验以及一些常见的CSS考题。 一、CSS测验的类型 1…