【GeekBand】C++设计模式笔记5_Observer_观察者模式

news2024/11/25 3:06:31

1. “组件协作”模式

  • 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式
    • Template Method
    • Strategy
    • Observer / Event

2. Observer 观察者模式

2.1 动机(Motivation)

  • 在软件构建过程中,我们需要为某些对象建立一种 “通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。
  • 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。

2.2 模式定义

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

2.3 实例代码

2.3.1 FileSplitter1
// 文件分割器类
class FileSplitter
{
	string m_filePath;	// 原文件路径
	int m_fileNumber;	// 要分割的小文件数
	ProgressBar* m_progressBar;	// 进度条

public:
	FileSplitter(const string& filePath, int fileNumber, ProgressBar* progressBar) :
		m_filePath(filePath), 
		m_fileNumber(fileNumber),
		m_progressBar(progressBar) {

	}

	void split() {

		// 1.读取大文件

		// 2.分批次向小文件中写入
		for (int i = 0; i < m_fileNumber; i++) {
			// ...
			float progressValue = m_fileNumber;
			progressValue = (i + 1) / progressValue;
			m_progressBar->setValue(progressValue);
		}

	}
};
class MainForm : public Form
{
	TextBox* txtFilePath;
	TextBox* txtFileNumber;
	ProgressBar* progressBar;

public:
	void Button1_Click() {

		string filePath = txtFilePath->getText();
		int number = atoi(txtFileNumber->getText().c_str());

		FileSplitter splitter(filePath, number, progressBar);

		splitter.split();

	}
};
2.3.2 FileSplitter2
class IProgress {
public:
	virtual void DoProgress(float value) = 0;
	virtual ~IProgress() {}
};

// 文件分割器类
class FileSplitter
{
	string m_filePath;	// 原文件路径
	int m_fileNumber;	// 要分割的小文件数

	List<IProgress*>  m_iprogressList; // 抽象通知机制,支持多个观察者,List中存的是指针,每个指针指向某一种进度条类型
	
public:
	FileSplitter(const string& filePath, int fileNumber) :
		m_filePath(filePath), 
		m_fileNumber(fileNumber) {

	}


	void split() {

		// 1.读取大文件

		// 2.分批次向小文件中写入
		for (int i = 0; i < m_fileNumber; i++) {
			// ...

			float progressValue = m_fileNumber;
			progressValue = (i + 1) / progressValue;
			onProgress(progressValue);	// 给所有观察者发送通知
		}

	}

	// 向 List 中添加观察者
	void addIProgress(IProgress* iprogress) {
		m_iprogressList.push_back(iprogress);
	}
	
	// 从 List 中移除观察者
	void removeIProgress(IProgress* iprogress) {
		m_iprogressList.remove(iprogress);
	}


protected:
	virtual void onProgress(float value) {
		
		List<IProgress*>::iterator itor = m_iprogressList.begin();
		
		// 对List中的每种进度条都进行更新
		while (itor != m_iprogressList.end())
			(*itor)->DoProgress(value); // 更新进度条
			itor++;
		}
	}
};

PS:

  • FileSplitter 对象与 List 中的具体进度条类型的关系呈现为一对多关系,随着文件分割器进度变化,需要更新所有类型的进度条;
  • 使用统一接口( IProgress 类的 DoProgress 函数)进行进度条更新,所以每种进度条类型都要继承 IProgress 类。

2.4 结构(Structure)

在这里插入图片描述

2.5 要点总结

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

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

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

相关文章

D28【python 接口自动化学习】- python基础之输入输出与文件操作

day28 输入 学习日期&#xff1a;20241005 学习目标&#xff1a;输入输出与文件操作&#xfe63;-40 输入&#xff1a;如何接收用户通过键盘输入的数据&#xff1f; 学习笔记&#xff1a; 输入设备与输入方式 Input函数 命令行参数 可选参数 必填参数 强制转换参数类型 总…

认知战认知作战:2024年10月4日美国非农数据发布背景下的全球认知战分析——策略、手段与应对

认知战认知作战&#xff1a;2024年10月4日美国非农数据发布背景下的全球认知战分析——策略、手段与应对 关键词&#xff1a;认知战,非农数据,美联储,加息,信息操控,心理战,市场恐慌,虚假信息,防御方,攻击方,舆论引导,虚假数据,断章取义,金融市场,信息不对称,经济政策,虚假专家…

基金好书入门阅读笔记《基金作战笔记:从投基新手到配置高手的进阶之路》1

今年的新书《基金作战笔记&#xff1a;从投基新手到配置高手的进阶之路》&#xff0c;趁着国庆前这个风潮&#xff0c;拿来学习下。 第一章 军规 军规1&#xff1a;莫求暴富&#xff0c;为自己设定一个长期目标。 军规2&#xff1a;永不满仓&#xff0c;找到自己的资产配置中…

基于Python的自然语言处理系列(24):BiDAF(双向注意力流)

在自然语言处理领域,机器阅读理解(Machine Comprehension, MC)是一个重要的任务。在这篇博文中,我们将实现论文 BiDAF 中提出的双向注意力流模型。BiDAF 主要改进了传统注意力机制中的早期信息摘要问题,并引入了字符嵌入来加强对单词细粒度信息的理解。 1. 加载 SQuAD 数据…

在VSCode中编写Html

1.下载VSCode&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 2.安装插件&#xff1a; 简体中文插件可把界面改成中文 3.打开一个文件夹&#xff1a;用于在这个文件夹内写Html 5.新建文件&#xff1a;sheet.html,按 &#xff01; tab键可以生成HTML文件标准格式…

网络基础 【HTTP】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a; &#x1f4bb;操作环境&#xff1a; CentOS 7.6 华为云远程服务器 &#x1f339;关注我&#x1faf5;带你学习更多Linux知识…

JC4805快速入门

目录 一、产品概述二、驱动器参数2.1、产品尺寸2.2、技术参数 三、接口说明3.1、电源接口3.2、电机接口3.3、USB接口3.4、CAN接口3.5、SPI接口3.6、ABZ接口3.7、Hall接口3.8、电机温度检测3.9、状态指示灯 四、硬件接线五、软件操作5.1、设置参数5.2、零点校准5.3、运行调试5.4…

【JavaWeb】javaweb目录结构简介【转】

以上图说明&#xff1a; bbs目录代表一个web应用bbs目录下的html,jsp文件可以直接被浏览器访问WEB-INF目录下的资源是不能直接被浏览器访问的web.xml文件是web程序的主要配置文件所有的classes文件都放在classes目录下jar文件放在lib目录下

Gitee创建仓库,提交代码到自己的fork,合并到主分支

一、创建仓库 1、创建仓库 2、添加仓库成员 3、初始化项目 3.1 在项目目录中右击用Git Bash here打开&#xff0c;先git init创建新的空白存储库&#xff0c;使现有项目成为Git项目。 3.2 克隆仓库地址&#xff0c;拉取新建的仓库&#xff0c;此时项目文件夹中会出现一个仓库…

CNN-GRU时序预测 | MATLAB实现CNN-GRU卷积门控循环单元时间序列预测

时序预测 | MATLAB实CNN-GRU卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实CNN-GRU卷积门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 本次运行测试环境MATLAB2020b 提出了一种基于卷积神经网络(Convolutional Neural Network…

《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!

本篇博客深入探讨了 C 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景&#xff0c;然后详细分析了它们的实现方法&#xff0c;包括高效接口设计和性能优化策略。接着&#xff0c;我们通过对比这两种数据结构的性能&#xff0c;探讨了…

Ray_Tracing_The_Next_Week下

5image Texture Mapping 图像纹理映射 我们之前虽然在交点信息新增了uv属性&#xff0c;但其实并没有使用&#xff0c;而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值 现在通过uv坐标读取图片&#xff0c;通过std_image库stbi_load&#xff08;path&#xff09;…

“米哈游悄然布局未来科技:入股星海图,共绘具身智能机器人新篇章“

米哈游悄然入股具身智能机器人公司:技术布局与未来展望 近日,米哈游阿尔戈科技有限公司宣布入股具身智能机器人公司星海图,这一消息在行业内引起了广泛关注。米哈游,这家以游戏开发而闻名的企业,近年来正逐步扩大其在人工智能和新兴科技领域的投资布局,此次入股星海图正是…

k8s实战-2

k8s实战-2 一、Deployment1.多副本2.扩缩容3.自愈&故障转移4.滚动更新5.版本回退 二、Service1.ClusterIP2.NodePort 总结 一、Deployment Deployment 是 k8s 中的一个资源对象&#xff0c;用于管理应用的副本&#xff08;Pods&#xff09;。它的主要作用是确保集群中运行…

【web安全】——逻辑漏洞

1.逻辑漏洞 1.1. 简介 逻辑漏洞就是指攻击者利用业务/功能上的设计缺陷,获取敏感信息或破坏业务的完整性。一般出现在密码修改、越权访问、密码找回、交易支付金额等功能处。 逻辑漏洞的破坏方式并非是向程序添加破坏内容,而是利用逻辑处理不严密或代码问题或固有不足&#x…

震动传感器介绍及实战

目录 前言 震动传感器 1.震动传感器配图 2.震动传感器原理图 3.震动传感器使用 1-震动传感器的意义 2-震动传感器的应用场景 3- SW-18010P震动传感器使用方法 震动传感器控制灯 操作 增加延时 使用SPC-ISP生成演示函数 总结 前言 我们上节已经简单了解了LED的使用…

【GC日志和OOM日志分析】JVM GC日志和OOM Dump文件分析

1 缘起 充电、充电、充电。 增加一些必备的知识&#xff0c;帮助后续使用。 2 配置JVM参数 为分析GC日志以及OOM相关信息&#xff0c;配置JVM参数&#xff0c;分为三个部分&#xff1a; &#xff08;1&#xff09;堆内存&#xff0c;包括年轻代、最大堆内存&#xff1b; &a…

2024CSP-J复赛易错点

低级错误 不开long long见祖宗写代码要有输入&#xff0c;别没写输入就交写完代码要在本地测试&#xff0c;多想写极端测试数据&#xff0c;或对拍注意考官说文件夹怎么建&#xff0c;别文件夹建错&#xff0c;爆0别忘写freopen或忘给freopen去注释记着把.exe文件删掉考试时不…

海龟绘图画小汽车

1、效果图&#xff1a; 2、完整代码 import turtlet turtle.Turtle() #创建一个新的画布对象t.penup() t.goto(0,80) t.pendown()t.fillcolor("red") t.begin_fill() t.lt(180) t.fd(60) t.lt(45) t.fd(113) t.rt(45) t.fd(80) t.lt(90) t.fd(80) t.…

win系统网络重置

重置网络命令&#xff1a;netsh winsock reset 输入winR 调用运行窗口&#xff0c;回车 输入重置网络命令&#xff1a;netsh winsock reset 注意空格