【观察者模式】

news/2024/6/15 17:49:08/文章来源:https://blog.csdn.net/m0_59068776/article/details/137278638

观察者模式

什么是观察者模式?

观察者模式定义了对象之间的一种一对多依赖关系,允许多个观察者对象同时监听某一个主题对象。这种模式是事件驱动编程的核心,其主要目标是实现对象间的松耦合。松耦合的设计允许我们构建灵活的系统,组件可以独立于其他组件进行扩展和修改。

观察者模式的关键参与者

观察者模式的实现涉及两类对象:

  • 主题(Subject): 拥有重要状态的对象,当这个状态发生变化时,需要通知所有注册的观察者。主题提供接口,允许观察者对象订阅或取消订阅事件通知。

  • 观察者(Observer): 感兴趣于主题状态变化的对象。每个观察者都必须实现一个更新接口,以便在状态变化时被通知。

观察者模式的工作原理

当主题的状态发生变化时,它会自动通知所有订阅者(即观察者)。观察者获得状态更新的通知后,可以执行相应的动作。这种通信机制对于实现如图形用户界面(GUI)系统、游戏开发或者实时数据处理等领域至关重要。

观察者模式的优点

  1. 松耦合设计:观察者与主题之间的交互减少了相互依赖,使得单独修改观察者或主题变得简单而不影响其他部分。

  2. 动态订阅:对象可以在运行时动态地订阅或取消订阅事件,增强了灵活性。

  3. 广播通信:主题可以向所有感兴趣的观察者广播通知,这是一种有效的通信方式。

 //观察者模式  (发布——订阅)设计模式//行为性模式:主要关注的是对象之间的通信//主要关注的是对象的一对多的关系,也就是多个对象都依赖一个对象,当该对象的状态发生改变时//其它对象都能够接收到相应的通知 /*Observer1 Observer2 Observer3Subject(主题) 主题有更改,应该及时通知相应的观察者 处理相应的事件*/​class Observer{public:virtual void handle(int msgid) = 0;//处理消息的接口};​//第一个实例     class Observer1 : public Observer{public:void handle(int msgid){switch(msgid){case 2:cout<<"Observer2 recv 2 msg"<<endl;break;default:cout<<"Observer2 recv unknow msg"<<endl;break;}}};​//第二个实例class Observer2 : public Observer{public:void handle(int msgid){switch(msgid){case 1:cout<<"Observer3 recv 1 msg"<<endl;break;case 2:cout<<"Observer3 recv 3 msg"<<endl;break;default:cout<<"Observer3 recv unknow msg"<<endl;break;}}};​//第三个实例class Observer3 : public Observer{public:void handle(int msgid){switch(msgid){case 1:cout<<"Observer recv 1 msg"<<endl;break;case 2:cout<<"Observer recv 2 msg"<<endl;break;default:cout<<"Observer recv unknow msg"<<endl;break;}}};​class Subject{public://给主题增加观察者对象void addObserver(Observer* obser, int msgid){_subMap[msgid].push_back(obser); //如果键存在就返回它所对应的引用,如果不存在他会插入    }//主题检测发生改变,通知相应的观察者对象处理事件void dispath(int msgid)//有相应的事情发生了 我就通知它{auto it = _subMap.find(msgid);if(it != _subMap.end()){for(Observer *pobser : it->second){pObser->handle(msgid);}}​}private://多个消息对一个时间感兴趣 所以要弄一个队列unordered_map<int,list<Observer*>> _subMap;};int main(){Subject subject;Observer *p1 = new Observer1();Observer *p2 = new Observer2();Observer *p3 = new Observer3();subject.addObserver(p1,1);subject.addObserver(p1,2);subject.addObserver(p2,2);subject.addObserver(p3,1);subject.addObserver(p3,3);int msgid = 0;for(;;){cout<<"输入消息id";cin>>msgid;if(msgid == -1 )break;}return 0;}

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

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

相关文章

【深耕 Python】Data Science with Python 数据科学(7)书352页练习题

写在前面 关于数据科学环境的建立&#xff0c;可以参考我的博客&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;1&#xff09;环境搭建 往期数据科学博文&#xff1a; 【深耕 Python】Data Science with Python 数据科学&#xff08;2&#xf…

pycharm复习

目录 1.基础语法 2.判断语句 3.while循环 4.函数 5.数据容器 1.基础语法 1.字面量 2.注释&#xff1a; 单行注释# 多行注释" " " " " " 3.变量&#xff1a; 变量名 变量值 print&#xff1a;输出多个结果&#x…

【React】react 使用 lazy 懒加载模式的组件写法,外面需要套一层 Loading 的提示加载组件

react 组件按需加载问题解决 1 错误信息2 解决方案 1 错误信息 react 项目在创建 router 路由时&#xff0c;使用 lazy 懒加载时&#xff0c;导致以下报错&#xff1a; The above error occurred in the <Route.Provider> component:Uncaught Error: A component suspe…

链游系统开发运营版丨链游系统开发指南教程

在当今数字经济时代&#xff0c;区块链技术的发展不仅改变了金融行业&#xff0c;也深刻影响了游戏产业。链游系统&#xff08;Blockchain Game System&#xff09;作为区块链技术与游戏行业的结合&#xff0c;正在成为新一代游戏的趋势。本文将为您详细介绍链游系统的开发与运…

Redis配置与优化

目录 引言 一、关系型数据库与非关系型数据库 1、关系型数据库 2、非关系型数据库 3、关系型数据库和非关系型数据库的区别 1.数据存储方式不同 2.扩展方式不同 3.对事物性的支持不同 4、非关系型数据库产生背景 二、Redis简介 1、Redis优点 2、Redis为什么这麽快&…

SSM框架学习——工厂模式、Spring核心容器与Bean

工厂模式、核心容器与Spring Bean 工厂模式 工厂模式是Java中常用的一种设计模式&#xff0c;这种类型的设计模式属于创建型模式。说白了在代码层面就是取消了new的使用。 工厂模式有三种&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 举个例子&#xff0c;我们去买…

损失函数与激活函数的适配

参考来源&#xff1a; 项目文件预览 - easy-algorithm-interview-and-practice - GitCode

2024 ccfcsp认证打卡 2022 06 01 归一化处理

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 输入数字的个数int[] a new int[1010]; // 创建一个数组来存储输入的数字double sum 0; // 用于计算所有输入数字的总…

智能锁也能用上GPT技术了?大扭力电机更配中国门?这家公司再次引领行业

智能锁也能用上GPT技术了&#xff1f;小小智能锁电机&#xff0c;竟然能拉动2.5吨SUV&#xff1f; 今日&#xff0c;中国智能锁领军品牌德施曼在北京举办「2024德施曼创新技术预沟通会」&#xff0c;德施曼技术研发中心总监桑胜伟揭秘了两项行业突破性技术——GPTfinger及龙霆…

Springboot中的三层架构

我们在进行前后端交互的时候&#xff0c;会分为数据访问&#xff0c;业务逻辑&#xff0c;接受请求并响应数据三个操作&#xff0c;这三部分其实是可以拆分的&#xff0c;让他们解耦&#xff0c;否则代码复用性差并且不易维护&#xff0c;所以诞生了三层架构——1.Dao(数据访问…

LLMs 可能在 2 年内彻底改变金融行业

在艾伦图灵研究所&#xff08;The Alan Turing Institute&#xff09;最新的一项研究中&#xff0c;我们看到了大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的一种可能性。它有望通过检测欺诈行为、生成财务洞察以及自动化客户服务&#xff0c;…

在制定OKR的过程中,应该怎么确定目标O的来源或方向?

在制定OKR&#xff08;Objectives and Key Results&#xff0c;目标与关键成果&#xff09;的过程中&#xff0c;确定目标O的来源或方向是至关重要的一步。一个明确、合理的目标能够为团队指明方向&#xff0c;激发团队成员的积极性和创造力&#xff0c;进而推动公司的整体发展…

Postman中参数填写方式

Postman中参数填写和请求方法有关&#xff0c;一般接口用例请求方法GET与POST常用&#xff0c;所以主要是这两种请求方法请求参数填写 一、GET请求方法参数填写 1、直接在URL中填写请求参数,如直接在URL中填写&#xff1a; http://www.example.com:8089/userapi?unamelisi&…

激发数据潜力:企业数据中台的策略性构建与优化_光点科技

在信息时代&#xff0c;数据是企业价值链中不可或缺的一环。构建一个策略性的企业数据中台不仅能够整合分散的数据资源&#xff0c;还能提高决策效率和业务敏捷性。本文聚焦于如何策略性地构建和优化数据中台&#xff0c;以便企业能够最大化地利用数据资源&#xff0c;推动企业…

网络钓鱼升级 Darcula如何窃取用户信息

近日&#xff0c;网络安全领域一种名为 “Darcula” 的网络钓鱼欺诈&#xff08;PhaaS&#xff09;悄然兴起。这种新型钓鱼方式不同于传统的手段&#xff0c;它巧妙地利用了谷歌信息和 iMessage 的富通信服务&#xff08;RCS&#xff09;&#xff0c;成为了网络犯罪分子的新手段…

2024年04月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

nvm管理node版本后手动安装npm包管理

在命令行npm检查 检查过node后&#xff0c;输入指令npm -v来检查npm是否安装成功。 毕竟node8以上的版本&#xff0c;就不支持npm的自动安装了。 如果显示npm版本号&#xff0c;说明npm也安装成功。 如果显示npm非内部指令或外部指令等字样&#xff0c;说明npm并没有自动安…

[C/C++] -- 二叉树

1.简介 二叉树是一种每个节点最多有两个子节点的树结构&#xff0c;通常包括&#xff1a;根节点、左子树、右子树。 满二叉树&#xff1a; 如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。深度为k&a…

怎么让ChatGPT批量写作原创文章

随着人工智能技术的不断发展&#xff0c;自然语言处理模型在文本生成领域的应用也日益广泛。ChatGPT作为其中的佼佼者之一&#xff0c;凭借其强大的文本生成能力和智能对话特性&#xff0c;为用户提供了一种高效、便捷的批量产出内容的解决方案。以下将就ChatGPT批量写作内容进…

机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用,结合生活中的生动例子帮助大家理解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用&#xff0c;结合生活中的生动例子帮助大家理解。GaussianNB&#xff0c;即高斯朴素贝叶斯模型&#xff0c;是一种基于概率论的分类算法&#xff0c;广泛应…