C++|观察者模式

观察者模式:

定义对象间的一种一对多(变化)的依赖关系,以便当一个 对象(Subject)的状态发生改变时,所有依赖于它的对象都 得到通知并自动更新

动机:

在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密, 将使软件不能很好地抵御变化。

使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合

总结:

  • 使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
  • 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。
  • 观察者自己决定是否需要订阅通知,目标对象对此一无所知。
  • Observer模式是基于事件的UI框架中非常常用的设计模式,也是 MVC模式的一个重要组成部分。

实践案例

假如现有有一个业务场景,我们需要写一个视频检测器,该检测器会使用图像分割模型对输入的视频流进行检测,如果监测到画面有人,那么需要做针对人的具体操作(比如将人框出来,比如将人截取出来),如果检测到画面中有汽车,也会做具体操作(比如将汽车涂为红色)等等。
这样一个业务场景普通的写法,我们很容易想到,读取视频流,然后对每一帧图像检测,然后写if else
if 检测到人 {…}
else if 检测到汽车 {…}
else if 检测到天空 {…}
这样的实现方式可以满足需求,但是并不满足我们的设计原则
这是一个紧耦合的做法,你的检测器要依赖于其他的视频操作类,不符合我们的依赖倒置原则
我们可以将操作类抽象成一个接口,然后再需要操作的时候,调用接口。这样就解决了这个问题
不过还有一点,在这个业务场景中,操作类有不同的操作,也就是说需要多个操作
因为我们进一步抽象
我们写一个操作基类,然后再写多个操作类1,操作类2,都继承基类
到这一步,其实观察者模型就出来了

观察者模型:
我们可以把视频看作一个被观察者,检测到的结果(人、汽车、树木等),这些相当于信息通知,给谁通知呢?给那些具体的操作类通知,所以我们可以把对人操作的类、对汽车操作的类这些看作观察者。
被观察者将消息发送给观察者,观察者根据消息来做不同的操作(多态)
并且在这个过程中,支持观察者自主选择是否订阅消息。
在这里插入图片描述

代码实现以及注释:

#include <string>
#include <iostream>
#include <list>
using namespace std;class Observer {// 抽象类(接口)
public:virtual void handleVideo(string detectInfo) = 0;virtual ~Observer() {}
};class Observer1 : public Observer {
public:virtual void handleVideo(string detectInfo) {cout << "截取人" << endl;}
};class Observer2 : public Observer {
public:virtual void handleVideo(string detectInfo) {cout << "截取汽车" << endl;}
};class VideoDetecter {string m_filePath;string m_fileName;list<Observer*>  m_observerList; // 抽象通知机制,支持多个观察者public:VideoDetecter(string filePath, string fileName) {m_filePath = filePath;m_fileName = fileName;}void detect() {//1.读取视频流cout << "读取视频流:" << m_filePath + m_fileName << endl;//2.循环每一帧处理int frameNum = 10;for (int i = 0; i < frameNum; i++) {//假设对第i帧图像处理得到识别结果 结果记作 detectInfostring detectInfo = "识别结果";sendNotify(detectInfo);//发送通知}}void addObserver(Observer* observer) { //添加观察者m_observerList.push_back(observer);}void removeObserver(Observer* observer) { //移除观察者m_observerList.remove(observer);}
protected:virtual void sendNotify(string detectInfo) {list<Observer*>::iterator itor = m_observerList.begin();while (itor != m_observerList.end()) {(*itor)->handleVideo(detectInfo); //不同观察者对通知做出响应itor++;}}
};int main() {string filePath = "/root/home/videoPath/";string fileName = "001.mp4";Observer* observer;VideoDetecter detecter(filePath, fileName);Observer1 ob1;Observer2 ob2;detecter.addObserver(&ob1);detecter.addObserver(&ob2);detecter.detect();detecter.removeObserver(&ob1);detecter.removeObserver(&ob2);//detecter.detect();}

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

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

相关文章

数学之美 — 1

为什么你会想和他人共享那些美丽的事物呢&#xff1f;因为这会让他&#xff08;她&#xff09;感到愉悦&#xff0c;也能让你在分享的过程中重新欣赏一次事物的美。 ——David Blackwell 1、感官之美&#xff0c;对于那些有规律的事物&#xff0c;你可以利用自己的视觉、触觉、…

python自动化测试- 自动化框架及工具

1 概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本系列选择的测试语言是 python 脚本语言。由于其…

C# NetTopologySuite+ProjNet 任意图形类型坐标转换

添加引用&#xff1a;NetTopologySuite、ProjNet、ProjNet.SRID Program.cs文件&#xff1a; using ProjNet.CoordinateSystems; using ProjNet.CoordinateSystems.Transformations; using ProjNet.SRID; using System; using System.Collections.Generic; using System.Linq;…

python通过docker打包执行

背景 正常情况下,python脚本执行需要安装有python环境,那python环境虽然也可以通过移植的方法来安装,那总归是比较麻烦的,下面通过docker打包的方式来执行python脚本 1、安装python镜像 准备两个文件即可,dockerfile、requirements.txt两个文件的内容分别如下 同目录下…

泼辣修图Ploarr5.11.7电脑最新简体中文版下载

泼辣修图专业版是一款强大的专业修图软件&#xff0c;拥有上百款调色工具还有丰富的图层素材&#xff0c; 更有智能的人像修饰面板&#xff0c;具备物体识别的智能蒙板&#xff0c;高效的滤镜管理系统和强大的文字工具&#xff0c;支持批量处理。一切围绕摄影&#xff0c;无论是…

只考一门数据结构!安徽工程大学计算机考研

安徽工程大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文992字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 安徽工程大…

three.js(六):自适应设备分辨率

自适应设备分辨率 当今大多数的PC端和移动端显示器都是HD-DPI显示器。HD-DPI 是High Definition-Dots Per Inch 的简称&#xff0c;意思是高分辨率显示器。不同设备的显示器的分辨率是不一样的。 以上图中的iPhone6/7/8 为例&#xff1a;375*667 代表的手机的屏幕的物理尺寸&a…

海康机器人工业相机 Win10+Qt+Cmake 开发环境搭建

文章目录 一. Qt搭建海康机器人工业相机开发环境 一. Qt搭建海康机器人工业相机开发环境 参考这个链接安装好MVS客户端 Qt新建一个c项目 cmakeList中添加海康机器人的库&#xff0c;如下&#xff1a; cmake_minimum_required(VERSION 3.5)project(HIKRobotCameraTest LANG…

Go framework-go-zero

一、Go Go天然适配云原生&#xff0c;而云原生时代已经到来&#xff0c;各个应用组件基础设施等都应该积极的去拥抱云原生。 不要让框架束缚开发。 1、go-zero介绍 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性&#xff0c;…

[C/C++]天天酷跑超详细教程-中篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

mac 安装 homebrew

摘要&#xff1a; 本文主要是下载安装包安装homebrew&#xff0c;然后配置环境变量Path。检验是否安装成功。 homebrew地址&#xff1a;macOS&#xff08;或 Linux&#xff09;缺失的软件包的管理器 — Homebrew 在终端命令下载安装&#xff1a; /bin/bash -c "$(curl…

CSS学习笔记04

CSS笔记04 浮动 标准文档流 标准文档流就是浏览器按照各种元素标签排版布局中默认的状态。浏览器在渲染代码的时候是从左往右、从上到下开始渲染&#xff0c;元素也是从左往右、从上往下的流式排列。也就是没有被其他排版浮动和定位相关的 CSS 属性干扰的就叫标准文档流。标…

redis面试题二

redis如何处理已过期的元素 常见的过期策略 定时删除&#xff1a;给每个键值设置一个定时删除的事件&#xff0c;比如有一个key值今天5点过期&#xff0c;那么设置一个事件5点钟去执行&#xff0c;把它数据给删除掉&#xff08;优点&#xff1a;可以及时利用内存及时清除无效数…

Android之自定义时间选择弹框

文章目录 前言一、效果图二、实现步骤1.自定义Dialog2.xml布局3.背景白色转角drawable4.取消按钮背景drawable5.确定按钮背景drawable6.NumberPicker样式和弹框样式7.弹框动画8.Activity使用 总结 前言 随着产品人员不断变态下&#xff0c;总是会要求我们的界面高大上&#xf…

DETRs Beat YOLOs on Real-time Object Detection

目录 1、模型架构1.1高效混合编码器1.1.1 尺度内特征交互模块AIFI1.1.2 跨尺度特征融合CCFM 1.2IoU感知查询选择总结 DETRs在实时目标检测中击败YOLO 问题&#xff1a;DETR的高计算成本&#xff0c;实时检测效果有待提高 解决&#xff1a;提出了一个实时的目标检测器 具体来说…

ChatGPT对软件测试的影响

ChatGPT 是一个经过预训练的 AI 语言模型&#xff0c;可以通过聊天的方式回答问题&#xff0c;或者与人闲聊。它能处理的是文本类的信息&#xff0c;输出也只能是文字。它从我们输入的信息中获取上下文&#xff0c;结合它被训练的大模型&#xff0c;进行分析总结&#xff0c;给…

前端基础3——JavaScript基础用法

文章目录 一、基本使用1.1 内部方式1.2 外部导入方式1.3 css标签调用js脚本&#xff08;触发事件&#xff09; 二、Windows对象2.1 对象属性2.2 对象方法 三、数据类型3.1 字符串处理3.2 数组处理3.3 对象处理 四、流程控制4.1 操作符4.2 if判断语句4.3 for循环语句4.4 continu…

机器学习——聚类算法一

机器学习——聚类算法一 文章目录 前言一、基于numpy实现聚类二、K-Means聚类2.1. 原理2.2. 代码实现2.3. 局限性 三、层次聚类3.1. 原理3.2. 代码实现 四、DBSCAN算法4.1. 原理4.2. 代码实现 五、区别与相同点1. 区别&#xff1a;2. 相同点&#xff1a; 总结 前言 在机器学习…

ASCII码 对照表

总256个字符元素 0&#xff5e;255 码值整数据 字符结构 字符元素(内容) 整数结构 码值整数

怎么将pdf合并成一个?将pdf合并成一个的方法

在日常工作和学习中&#xff0c;我们经常会遇到需要将多个PDF文件合并成一个的情况。这不仅能够提高文件管理的便捷性&#xff0c;还能节省存储空间并使阅读更加流畅。那么&#xff0c;怎么将pdf合并成一个呢&#xff1f;在本文中&#xff0c;我将为您介绍几种简单实用的方法&a…