【观察者模式】

观察者模式

什么是观察者模式?

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

观察者模式的关键参与者

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

  • 主题(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.hqwc.cn/news/589897.html

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

相关文章

【漏洞复现】科立讯指挥调度管理平台存在命令注入漏洞

0x01 产品简介 科立讯指挥调度管理平台是一个专业针对通信行业的管理平台。该产品旨在提供高效的指挥调度喝管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设备、维护人员和工作任务等。用…

C语言:文件操作(一)

目录 前言 1、为什么使用文件 2、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 结&#xff08;一&#xff09; 前言 本篇文章将介绍C语言的文件操作&#xff0c;在后面的内容讲到&#xff1a;为什么使用文…

C++的并发世界(五)——线程状态切换

0.线程状态 初始化&#xff1a;该线程正在被创建&#xff1b; 就绪&#xff1a;该线程在列表中就绪&#xff0c;等待CPU调度&#xff1b; 运行&#xff1a;该线程正在运行&#xff1b; 阻塞&#xff1a;该线程被阻塞挂机&#xff0c;Blocked状态包括&#xff1a;pend&#xff…

Apache DolphinScheduler 【安装部署】

前言 今天来学习一下 DolphinScheduler &#xff0c;这是一个任务调度工具&#xff0c;现在用的比较火爆。 1、安装部署 1.0、准备工作 1.0.1、集群规划 dolphinscheduler 比较吃内存&#xff0c;所以尽量给 master 节点多分配一点内存&#xff0c;桌面和虚拟机里能关的应用…

Golang 开发实战day07 - Functions

Golang 教程07 - Functions 1. Functions 1.1 什么是函数&#xff1f; 在 Golang 中&#xff0c;函数就像是代码的超级组合体&#xff0c;可以将一段代码封装成一个独立的单元&#xff0c;以便重复使用。 1.2 函数声明 func funcName(parameter1 type1, parameter2 type2)…

Leetcode刷题-数组(二分法、双指针法、窗口滑动)

数组 1、二分法 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 需要注意区间的问题。首先在最外面的循环判断条件是left<right。那就说明我们区间规定的范围就是【left,right】 属于是左闭右闭&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

一文让你彻底理解 AdaBoost 自适应提升算法 | AdaBoost 的关键要点、基本原理、优缺点和实际应用

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、关键要点 AdaBoost&#xff0c;即自适应提升&#xff08;Adaptive Boosting&#xff09;算法的缩写&#xff0c;是一种基于 Boosting 策略的集成学习方法&#xff0c;旨在降低偏差。AdaBoost 的 “…

【面试HOT200】链表篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试coding部分的&#xff0c;整理期间苛求每个算法题目&#xff0c;平衡可读性与代码性能&#xff08;leetcode运行复杂度均打败80%以上&#xff09;。 &#x1f970;来源&#xff1a;材料主要源于…

softmax函数的功能及用法

Softmax函数是一种常用的激活函数&#xff0c;通常用于多分类问题的输出层。其功能是将一个具有任意实数值的向量&#xff08;通常称为“logits”&#xff09;转换为一个概率分布&#xff0c;其中每个元素的值表示对应类别的概率。 Softmax函数的公式如下&#xff1a; 给定一…

选择最适合的JavaScript混淆工具:详解JScrambler、JShaman、IpaGuard等五款在线服务

摘要 本篇技术博客将介绍五款常用且好用的在线JavaScript加密混淆工具&#xff0c;包括 jscrambler、JShaman、jsfack、freejsobfuscator 和 jjencode。通过对这些工具的功能及使用方法进行详细解析&#xff0c;帮助开发人员更好地保护和加密其 JavaScript 代码&#xff0c;提…

如何优化嵌入式系统的实时性能

大家好&#xff0c;今天给大家介绍如何优化嵌入式系统的实时性能&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 优化嵌入式系统的实时性能是一个综合性的任务&#xff0c;涉及到…

C++的并发世界(六)——互斥解决数据共享冲突

0.数据共享的问题 在多个线程中共享数据时。需要注意线程安全问题。如果多个线程同时访问同一个变量。并且其中至少有一个线程对该变量进行了写操作。那么就会出现数据竞争问题。数据竞争可能会导致程序崩溃,产生来定义的结果,或者得到错误的热果。为了避免数据竞争问题。需要…