设计模式——观察者模式(Observer)

观察者模式(Observer Pattern)是软件设计模式的一种,也被称为模型-视图模式、源-收听者模式或从属者模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新。

基本构成

  1. 抽象主题(Subject):维护一个观察者列表,并提供增加、删除和通知观察者的接口。
  2. 具体主题(Concrete Subject):实现了抽象主题接口,并保存了具体状态,当状态发生改变时,会通知所有观察者。
  3. 抽象观察者(Observer):定义了一个更新接口,以便在得到主题状态改变通知时执行相应的操作。
  4. 具体观察者(Concrete Observer):实现了抽象观察者接口,并持有具体主题的引用,以便在主题状态改变时,从主题中获取新的状态数据并执行相应的操作。

优点

  1. 解耦:观察者模式降低了主题与观察者之间的耦合度,两者之间的依赖关系是通过接口实现的,因此主题不知道观察者的具体实现细节,观察者也不需要了解主题的内部状态。
  2. 可扩展性:当需要增加新的观察者时,只需要创建一个新的观察者类并实现观察者接口即可,无需修改原有的代码。
  3. 支持广播通信:观察者模式支持一对多的通信方式,当一个主题状态发生改变时,可以通知所有的观察者。

缺点

  1. 依赖关系没有完全解除:虽然观察者模式降低了主题与观察者之间的耦合度,但它们之间仍然存在依赖关系。如果观察者依赖于主题的某些特定方法或属性,那么当主题发生改变时,可能会影响观察者的正常工作。
  2. 性能问题:当观察者数量较多时,通知的发布可能会花费较长时间,影响程序的性能。
  3. 循环依赖:如果观察者和主题之间存在循环依赖关系,可能会导致系统崩溃。

应用场景

  1. 事件处理系统:如GUI(图形用户界面)中的按钮点击事件、键盘输入事件等。
  2. 实时数据更新:在需要实时更新数据的应用中,如股票市场监测、游戏开发等。
  3. 插件和扩展:许多编程库和框架使用观察者模式来支持插件和扩展,开发人员可以编写自定义观察者以响应库或框架中的事件或回调。
  4. 消息队列系统:生产者将消息发送到队列,而消费者作为观察者订阅队列以接收和处理消息。

实现方式

在实现观察者模式时,需要注意具体主题对象和具体观察者对象之间不能直接调用,否则会使两者之间紧密耦合起来,这违反了面向对象的设计原则。通常的做法是定义一个接口作为两者之间的桥梁,主题对象通过接口来通知观察者对象,而观察者对象也通过接口来接收通知并执行相应的操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注:Vite 需要 Node.js 版本 18,20 1.选定路径后再cmd输入创建…

ScienceDirect文献如何下载

ScienceDirect是爱思唯尔公司的全文数据库平台,是全球最大的科学、技术与医学全文电子资源数据库,是我们在查找外文文献常用的数据库。但是,ScienceDirect数据库的文献是需要使用权限才可获取的。如果你没有该数据库资源要如何查询下载文献呢…

likeshop多商户单商户商城_likeshop跑腿源码_likeshop物品租赁系统开源版怎么配置小程序对接?

本人是商业用户所以能持续得到最新商业版,今天我说下likeshop里面怎么打包小程序,大家得到程序时候会发现它有admin目录 app目录 server目录 这三个目录分别是做什么呢? 1.admin目录 下面都是架构文件使用得是Node.js打包得,至于…

教你快速记录每日待办事项,并提醒自己按时完成不忘记

在忙碌的日常生活中,我们经常会面临待办事项繁杂、时间紧迫的困扰。为了更高效地管理时间和任务,我们需要一个能够快速记录并准时提醒我们完成待办事项的工具。此时,敬业签这类的待办软件就成为了很多人的首选工具。 敬业签是一款功能强大的…

信息系统项目管理师0091:项目经理的能力(6项目管理概论—6.3项目经理的角色—6.3.3项目经理的能力)

点击查看专栏目录 文章目录 6.3.3项目经理的能力1.概述2.项目管理技能3.战略和商务管理技能4.领导力技能5.领导力与管理记忆要点总结6.3.3项目经理的能力 1.概述 项目经理需要重点关注三个方面的关键技能包括项目管理、战略和商务、领导力

合肥先进光源束测步进电机控制机箱接线方式

合肥先进光源束测步进电机控制方案介绍 对上篇文里的接线方式做个修订: EtherCat电机控制机箱接线规范 驱动器 控制器 接线方式 使用鸣志 STF05-ECX-H驱动器,每个机箱配8个驱动器使用汇川的H5U-1614MTD etherCat控制器每个驱动器的电源从2分8的分配端子…

AJ-Report开源数据大屏远程命令执行漏洞

文章目录 描述漏洞原理影响版本漏洞复现修复方案 描述 AJ-Report是全开源的一个BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。     多数据源支持,内置mysql、elasticsearch、kudu驱动,支持…

Linux基本指令(下下)

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 本篇博客续我之前的Linux指令(下&a…

美国站群服务器在站群管理中的防护和数据安全保障?

美国站群服务器在站群管理中的防护和数据安全保障? 美国站群服务器的防护和数据安全保障是站群管理中的关键问题。站群服务器位于美国,通常由专业的服务器提供商管理和维护,其安全性受到多方面因素的影响。 美国站群服务器在站群管理中的防护和数据安全…

流畅的python-学习笔记_一等函数

函数对象 函数也是对象,操作可像对象一般操作 高阶函数 高阶函数指接受参数为函数,或返回函数的函数 不少高阶函数在py3已经有了替代品。map, filter可通过生成式实现,reduce(在functools里)可通过sum实…

【强训笔记】day11

NO.1 思路&#xff1a;枚举&#xff0c;设一号大礼包的数量为x&#xff0c;二号大礼包的数量为y&#xff0c;用循环枚举一号大礼包的个数得到二号大礼包的数量&#xff0c;使得某一时刻axby的值最大。 代码实现&#xff1a; #include<iostream>using namespace std;lo…

存储故障后oracle报—ORA-01122/ORA-01207故障处理---惜分飞

客户存储异常,通过硬件恢复解决存储故障之后,oracle数据库无法正常启动(存储cache丢失),尝试recover数据库报ORA-00283 ORA-01122 ORA-01110 ORA-01207错误 以前处理过比较类似的存储故障case:又一起存储故障导致ORA-00333 ORA-00312恢复存储故障,强制拉库报ORA-600 kcbzib_kcr…

代码随想录打卡第14天第18天

二叉树 1 二叉树部分的一些新知 &#xff08;1&#xff09;二叉树的定义&#xff0c;C方法一定要知道&#xff0c;相对于链表而言&#xff0c;二叉树就是多了两个指针&#xff0c;即左右子节点 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : …

SSL证书中DV、OV和EV有什么区别,又该如何选择

SSL&#xff08;安全套接层&#xff09;证书作为一种加密工具&#xff0c;确保了网站与其用户之间传输的信息的安全性。而在选择SSL证书时&#xff0c;我们通常会看到三种类型&#xff1a;域名验证&#xff08;DV&#xff09;、组织验证&#xff08;OV&#xff09;和扩展验证&a…

西门子数控网络IP设定配置

总结&#xff1a;menuselect-诊断-屏幕下方右翻页找到tcp/ip&#xff0c;进去选择tcp/ip诊断&#xff0c;进去选择x130网口&#xff0c;点击更改&#xff0c; 如果没有更改&#xff0c;menuselect-调试-口令&#xff0c;输入口令 sunrise 然后重新配置tcp/ip&#xff0c;配置完…

保姆级教学 基于Hexo搭建个人网站(Github)

文章目录 搭建Hexo静态博客介绍一、注册Github账号二、 安装前置软件包三、 绑定github仓库创建SSH私钥添加私钥连接Github仓库 四、安装hexo1. 更改npm镜像源2. 创建一个文件夹 在里面打开终端3. 初始化hexo 五、切换主题1. 安装主题2. 修改默认主题查看修改主题后的网站 六、…

杭州恒生面试,社招,3年经验

你好&#xff0c;我是田哥 一位朋友节前去恒生面试&#xff0c;其实面试问题大部分都是八股文&#xff0c;但由于自己平时工作比较忙&#xff0c;完全没有时间没有精力去看八股文&#xff0c;导致面试结果不太理想&#xff0c;HR说节后通知面试结果&#xff08;估计是凉了&…

vue2编写主体页面

目录 一. 导入两张图片 二. 新建主体vue 三. 修改路由 1. 新增主体界面Main.vue的路由 2. 完整router/index.js代码如下: 在Vue 2中编写一个主体页面通常意味着创建一个包含导航栏、侧边栏、内容区域等的布局。以下是使用Vue 2和Element UI框架来构建一个简单的主体页面的…

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时&#xff0c;往该按钮上方添加一个悬浮元素&#xff0c;通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class&#xff0c;才能通过uni.createSelectorQuery来获取每个元素的节点信息&#xff1b; 2. 添加一个与…

Springai入门

一、概述 1.1发展历史 1.2大模型 大模型&#xff0c;是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。其设计目的在于提高模型的表达能力和预测性能&#xff0c;以应对更加复杂的任务和数据&…
最新文章