【观察者模式】

观察者模式

什么是观察者模式?

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

观察者模式的关键参与者

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

  • 主题(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.mzph.cn/news/787633.shtml

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

相关文章

SSH端口转发

SSH介绍 SSH通过网络远程访问主机提供保护&#xff0c;可以对客户端和服务端之间的数据传输进行压缩和加密&#xff0c;有身份验证、SCP、SFTP、和端口转发的功能 SSH转发常用的参数介绍&#xff1a; -C请求压缩所有数据-D动态转发、即socks代理-f后台执行SSH指令-g允许远程…

hxp CTF 2021 - A New Novel LFI(新颖的解法)

一、环境 unbentu&#xff0c;docker https://2021.ctf.link/assets/files/includers%20revenge-25377e1ebb23d014.tar.xz 二、解析 PHP Filter 当中有一种 convert.iconv 的 Filter &#xff0c;可以用来将数据从字符集 A 转换为字符集 B &#xff0c;其中这两个字符集可以…

极狐GitLab 13.11 重磅发布多项与 DevSecOps 相关的功能【五】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

我的一年创作纪念日

机缘 实际上在之前的文章之中我已经介绍过自己与csdn的缘分了&#xff0c;当初对算法十分的痴迷&#xff0c;也很希望能够将自己的一些理解写在csdn上&#xff0c;所以就开始了在csdn上的写作。 收获 在创作过程中最大的收获还是对过去所学的知识的总结吧&#xff0c;可惜的就…

蓝桥杯算法题-图形排版

题目描述 小明需要在一篇文档中加入 N 张图片&#xff0c;其中第 i 张图片的宽度是 Wi&#xff0c;高度是 Hi。   假设纸张的宽度是 M&#xff0c;小明使用的文档编辑工具会用以下方式对图片进行自动排版&#xff1a; 1. 该工具会按照图片顺序&#xff0c;在宽度 M 以内&…

企业客户信息反馈平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

《数据结构学习笔记---第九篇》---循环队列的实现

文章目录 1.循环队列的定义 2.循环队列的判空判满 3.创建队列并初始化 4.入队和出队 5. 返回队尾队首元素 6.释放循环队列 1.循环队列的定义 定义&#xff1a;存储队列元素的表从逻辑上被视为一个环。 我们此次实现的循环队列&#xff0c;采用顺序表 typedef struct {int…

Xception模型详解

简介 Xception的名称源自于"Extreme Inception"&#xff0c;它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构&#xff0c;用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同&#xff0…

图像生成:SD lora加载代码详解与实现

文章目录 前言一、SD模型介绍二、模型加载1. 模型架构加载2. safetensors权重加载3. lora权重加载 三、Name匹配四、权重融合1、构建net类2、匹配lora weight和model weight3、基于lora权重创建lora模块4、权重融合 五、整体pipeline总结 前言 SD中lora的加载相信都不陌生&…

VSCode美化

今天有空收拾了一下VSCode&#xff0c;页面如下&#xff0c;个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多&#xff0c;有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网&#xff1a;Maple-Font 我只安装了下图两个字体&#xff0c;使…

堆积排序python实现

堆积排序(Heap Sort)是一种基于二叉堆的排序算法。Python语言实现堆积排序算法可以如下所示: def heapify(arr, n, i):largest = i # Initialize largest as rootl = 2 * i + 1 # left = 2*i + 1r = 2 * i + 2

Java常用API之Encoders类解读

写在开头&#xff1a;本文用于作者学习Java常用API 我将官方文档中Collections类中所有API全测了一遍并打印了结果&#xff0c;日拱一卒&#xff0c;常看常新 在Spark中&#xff0c;Encoders类提供了一些静态方法用于创建不同数据类型的编码器。 首先&#xff0c;我遇到这样…

区块链面试题总结

1、什么是区块链&#xff1f; 区块链是不间断的经济交易数字分类账&#xff0c;可以进行编程&#xff0c;以记录不止金融交易&#xff0c;还可以记录其他有价值的东西&#xff0c;简单来说&#xff0c;区块链是一个不可变记录的分布式数据库&#xff0c;该数据库由计算机集群来…

今后的推进计划方针

今后的推进计划方针 信息数学物理 信息 线段树&#xff0c;其它的随缘。 数学 三角函数&#xff08;必修3&#xff09;-> 对数函数和指数函数 物理 随缘

Docker部署Nexus Maven私服并且实现远程访问Nexus界面

目录 ⛳️推荐 1. Docker安装Nexus 2. 本地访问Nexus 3. Linux安装Cpolar 4. 配置Nexus界面公网地址 5. 远程访问 Nexus界面 6. 固定Nexus公网地址 7. 固定地址访问Nexus ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&am…

使用混沌加密图像(MATLAB)

logistic图像加密是一种基于混沌理论的加密算法,它利用混沌系统的特性,如敏感依赖于初始条件和参数的非线性动态行为,来生成密钥和进行加密解密操作。以下是逻辑加密的基本原理和过程: 基本原理: 混沌系统特性利用:逻辑加密基于混沌系统的特性,利用混沌系统的非线性、不…

Vue3:使用Pinia的$subscribe+localStorage实现数据存储

一、情景说明 我们学习Vue的时候&#xff0c;知道可以用watch来监听数据的变化 那么&#xff0c;Pinia的store中的数据发生变化&#xff0c;如何监听了&#xff1f; 这里就用到$subscribe来实现效果 这一篇&#xff0c;$subscribelocalStorage实现数据存储的案例&#xff0c…

Nginx开发实战三:替换请求资源中的固定数据

文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址&#xff0c;我们通过nginx可以很便捷的将其改为外网访问&#xff0c;但是在外网访问这个地址后&#xff0c…

windows 使用 wsl 安装 linux 子系统

windows 使用 wsl 安装 linux 子系统 介绍使用如何启动设置基本配置安装和配置 SSH 服务 介绍 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软为Windows 10和Windows 11操作系统提供的一个功能&#xff0c;它允许用户在Windows上直接运行GNU/Linux环境。WSL提…

剑指offer--数组中重复的数字

一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…