[C++][设计模式][观察者模式]详细讲解
目录
- 1.动机
- 2.模式定义
- 3.要点总结
- 4.代码感受
- 1.代码一
- 1.FileSplitter.cpp
- 2.MainForm.cpp
- 2.代码二
- 1.FileSplitter.cpp
- 2.MainForm.cpp
1.动机
- 在软件构建过程中,需要为某些对象建立一种“通知依赖关系”
- 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知
- 如果这样的依赖关系过于紧密, 将使软件不能很好地抵御变化
- 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合
2.模式定义
- 定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
- 结构

3.要点总结
- 使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合
- 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播
- 观察者自己决定是否需要订阅通知,目标对象对此一无所知
- Observer模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分
4.代码感受
1.代码一
1.FileSplitter.cpp
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 = (i + 1) / m_fileNumber;m_progressBar->setValue(progressValue);}}
};
2.MainForm.cpp
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.代码二
1.FileSplitter.cpp
class IProgress
{
public:virtual void DoProgress(float value) = 0;virtual ~IProgress(){}
};class FileSplitter
{string m_filePath;int m_fileNumber;List<IProgress*> m_iprogressList; // 抽象通知机制,支持多个观察者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 = (i + 1) / m_fileNumber;onProgress(progressValue); //发送通知}}void addIProgress(IProgress* iprogress){m_iprogressList.push_back(iprogress);}void removeIProgress(IProgress* iprogress){m_iprogressList.remove(iprogress);}protected:virtual void onProgress(float value){List<IProgress*>::iterator itor = m_iprogressList.begin();while (itor != m_iprogressList.end()){(*itor)->DoProgress(value); //更新进度条itor++;}}
};
2.MainForm.cpp
class ConsoleNotifier : public IProgress
{
public:virtual void DoProgress(float value){cout << ".";}
};// 此处IProgess是接口继承
class MainForm : public Form, public IProgress
{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);ConsoleNotifier cn;splitter.addIProgress(this); //订阅通知splitter.addIProgress(&cn); //订阅通知splitter.split();}virtual void DoProgress(float value){progressBar->setValue(value);}
};
相关文章:
[C++][设计模式][观察者模式]详细讲解
目录 1.动机2.模式定义3.要点总结4.代码感受1.代码一1.FileSplitter.cpp2.MainForm.cpp 2.代码二1.FileSplitter.cpp2.MainForm.cpp 1.动机 在软件构建过程中,需要为某些对象建立一种“通知依赖关系” 一个对象(目标对象)的状态发生改变,所有的依赖对象…...
Adobe Acrobat 编辑器软件下载安装,Acrobat 轻松编辑和管理各种PDF文件
Adobe Acrobat,它凭借卓越的功能和丰富的工具,为用户提供了一个全面的解决方案,用于查看、创建、编辑和管理各种PDF文件。 作为一款专业的PDF阅读器,Adobe Acrobat能够轻松打开并展示各种格式的PDF文档,无论是文字、图…...
eVTOL飞机:技术挑战、应用机遇和运动的作用
最近,航空业的嗡嗡声围绕着电动空中出租车、空中拼车、无人驾驶航空货物运送等。这些概念都依赖于一类称为eVTOL的飞机,eVTOL是电动垂直起降的缩写。 与直升机类似,但没有噪音和排放,eVTOL可以在不需要简易机场的情况下飞行、悬停…...
【python】flask中如何向https服务器传输信息
【背景】 用flask做一个支持流媒体传输的网页,如何将信息post给流媒体服务器呢? 【方法】 简单例子,视图函数这么写: url = "https://yourip/mytext" headers = {Content-Type:application/octet-stream} @app.route(/,methods=["POST"...
计算机网络 —— 应用层(FTP)
计算机网络 —— 应用层(FTP) FTP核心特性:运作流程: FTP工作原理主动模式被动模式 我门今天来看应用层的FTP(文件传输协议) FTP FTP(File Transfer Protocol,文件传输协议&#x…...
zookeeper + kafka消息队列
zookeeper kafka 消息队列 一、消息队列简介 1、什么是消息队列 消息队列(Message Queue)是一种用于跨进程或分布式系统中传递消息的通信机制。消息队列在异步通信、系统解耦、负载均衡和容错方面具有重要作用。 (1)特性 异步…...
Python高级编程:深度学习基础
Python高级编程:深度学习基础 在前几篇文章中,我们探讨了Python的基础语法、面向对象编程、标准库、第三方库、并发编程、异步编程、网络编程与网络爬虫、数据库操作与ORM、数据分析与数据可视化以及机器学习基础。在这篇文章中,我们将深入探讨Python在深度学习领域的应用。…...
如何从magento1迁移到magento2
m2相较m1 变化可以说非常大,相当于从头到位都改写一遍,更现代化,更优雅。除了数据库表变化不是很大。 主要迁移的内容有: 1,主题 2,插件(自己开发的或者第三方插件) 3,数据库 主题 不能迁移到m…...
【Nginx】Nginx安装及简单使用
https://www.bilibili.com/video/BV1F5411J7vK https://www.kuangstudy.com/bbs/1353634800149213186 https://stonecoding.net/system/nginx/nginx.html https://blog.csdn.net/qq_40492693/article/details/124453090 Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器。其特…...
【Linux系列】find命令使用与用法详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Apple - DNS Service Discovery Programming Guide
本文翻译整理自:DNS Service Discovery Programming Guide(更新日期:2013-08-08 https://developer.apple.com/library/archive/documentation/Networking/Conceptual/dns_discovery_api/Introduction.html#//apple_ref/doc/uid/TP30000964 文…...
如何高效地为pip换源:详细操作指南
在Python开发中,pip是我们不可或缺的包管理工具。然而,默认的官方源下载速度较慢,尤其是在国内使用时可能会遇到网络问题。为了提高下载速度,我们可以通过更换国内的镜像源来解决这一问题。本文将详细介绍如何高效地为pip换源&…...
免费ddns工具,快解析DNS解析使用教程
DDNS(Dynamic Domain Name Server),中文叫动态域名解析,主要用于没有固定公网ip的网络环境下,使用一个固定的域名,解析动态变化的ip地址,达到远程访问的目的。 众所周知,目前公网ip资源非常紧缺…...
【Vite】控制打包结构
配置 vite.config.json 文件: import { defineConfig } from "vite";export default defineConfig({// ...build: {rollupOptions: {output: {entryFileNames: "js/[name]-[hash].js",chunkFileNames: "js/[name]-[hash].js",assetF…...
Debian Linux安装minikubekubectl
minikube&kubectl minkube用于在本地开发环境中快速搭建一个单节点的Kubernetes集群,还有k3s,k3d,kind都是轻量级的k8skubectl是使用K8s API 与K8s集群的控制面进行通信的命令行工具 这里使用Debian Linux演示,其他系统安装见官网,首先…...
Discuz动漫二次元风格网站模板
1、本模板为门户论坛个人空间形式,其中个人空间模板需要单独购买,点击购买,美化N多默认模板页面 2、全新设计的标签页,标签页帖子图文调用 3、论坛首页,分区下版块帖子论坛首页自动调用,自带分区图片模式与…...
RIP、OSPF、IS-IS学习
文章目录 前言RIP路由信息协议OSPF开放最短路径优先IS-IS 中间系统到中间系统总结 前言 路由协议的种类繁多,每种协议都有其独特的特性、工作原理和适用场景。本文将重点介绍:RIP(路由信息协议)、OSPF(开放最短路径优…...
移植案例与原理 - build lite源码分析 之 hb命令__main__.py
hb命令可以通过python pip包管理器进行安装,应该是OpenHarmony Build的缩写,在python包名称是ohos-build。hb作为编译构建子系统提供的命令行,用于编译构建产品、芯片厂商组件或者单个组件。本文,我们来学习hb的源码。 1、hb的安…...
Leo赠书活动-26期 不同数据库背后的数据存储方案
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 赠书活动专栏 ✨特色专栏:…...
在Windows10中使用Vim
服务器没有图形界面,但是numpy包又需要调用图形界面接口,这样就导致了错误,搞得我只好先回windows开发。看来当年 Ubuntu桌面版也不算是多此一举啊。 这么多ide我还是喜欢vim,因为它真的太简单了。咱们这个老年机启动的也非常快&…...
手把手教你将自定义视频问答JSON转成EasyR1可用的Parquet数据集
手把手教你将自定义视频问答JSON转成EasyR1可用的Parquet数据集 当你在构建视频问答模型时,可能已经收集了大量结构化的JSON格式数据,但如何将这些数据适配到EasyR1框架中却成了一个技术难题。本文将为你提供一个从零开始的完整解决方案,解决…...
S2-Pro+C语言教学系统:代码逻辑讲解与典型错误自动纠正
S2-ProC语言教学系统:代码逻辑讲解与典型错误自动纠正 1. 智能编程助教初体验 第一次看到S2-Pro在C语言教学中的应用效果时,确实让人眼前一亮。想象一下,当学生提交一段指针运算代码后,系统不仅能指出错误,还能像经验…...
河海大学材料科学与工程及材料与化工专业考研复试资料(含《材料分析方法》笔试专项)
温馨提示:文末有联系方式河海大学材料类考研复试资料全面升级 本套资料专为报考河海大学材料科学与工程、材料与化工两个硕士专业的考生设计,聚焦复试核心笔试科目——《材料分析方法》,助力精准高效备考。由2025届一志愿录取考生权威整理 所…...
【生产环境禁用警告】:这6个Python内存反模式正悄悄拖垮你的K8s Pod——附自动检测脚本
第一章:Python智能体内存管理策略生产环境部署在高并发、长生命周期的Python智能体服务中,内存管理直接影响系统稳定性与响应延迟。默认的CPython引用计数循环垃圾回收(GC)机制在动态对象频繁创建销毁的场景下易引发内存抖动和不可…...
PN5180 ISO15693协议栈实现与嵌入式NFC开发指南
1. PN5180库深度解析:面向嵌入式工程师的NFC ISO15693协议栈实现指南NXP PN5180是业界领先的多协议NFC控制器,支持ISO/IEC 14443 A/B、ISO/IEC 15693、Felica及NFC Forum Type 1–5标签。其核心优势在于高集成度射频前端、可编程调制解调器及灵活的主机接…...
BabyOS:MCU裸机开发的轻量级框架解析
1. BabyOS:专为MCU裸机开发设计的轻量级框架 在嵌入式开发领域,重复造轮子一直是困扰工程师的痛点。每次新项目启动,我们总需要重新调试那些基础功能模块——从串口通信到Flash操作,从定时器管理到协议栈实现。BabyOS的出现&#…...
抖音批量下载工具:高效获取无水印视频与图文内容的全攻略
抖音批量下载工具:高效获取无水印视频与图文内容的全攻略 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...
别再手动改请求头了!用BurpSuite插件5分钟搞定自动化添加(附完整Java代码)
解放双手:用BurpSuite插件实现HTTP请求头自动化管理 每次安全测试时,你是否也厌倦了反复点击"拦截"按钮、手动添加X-Debug-Header或修改User-Agent?作为一名长期与BurpSuite打交道的安全工程师,我深知这种重复性操作不仅…...
消费增值生态:从规则设计到商业价值实现
还在为用户复购低、留存弱、平台难长效而困扰?当多数商家还困在传统经营思路里止步不前,一套依托真实消费、贴合政策导向的增值生态已然崛起。它以合规为底、以价值为核、以闭环为骨架,正在重新定义平台与商家的增长逻辑,成为数字…...
STM32duino多传感器库:X-NUCLEO-IKS01A2驱动详解
1. 项目概述STM32duino X-NUCLEO-IKS01A2 是一个面向 Arduino 兼容生态(特别是基于 STM32 的开发板,如 NUCLEO-F401RE、NUCLEO-F411RE、NUCLEO-L476RG 等)的硬件抽象库,专为驱动 STMicroelectronics 官方推出的 X-NUCLEO-IKS01A2 …...
