Design patterns--观察者模式
设计模式之观察者模式
- 代码示例
#ifndef OBSERVER_H
#define OBSERVER_H#include <map>class Observer
{
public:Observer();virtual void update(std::map<int, double>) = 0;
};
#endif // OBSERVER_H#include "observer.h"Observer::Observer()
{}
#ifndef KAFKAPUSHER_H
#define KAFKAPUSHER_H
#include "observer.h"
#include <map>class KafkaPusher : public Observer
{
public:KafkaPusher();void update(std::map<int, double> msgPoints) override;void display();private:std::map<int, double> m_sailing;
};#endif // KAFKAPUSHER_H#include "kafkapusher.h"KafkaPusher::KafkaPusher()
{}void KafkaPusher::update(std::map<int, double> msgPoints)
{for(auto itr = msgPoints.begin(); itr != msgPoints.end(); ++itr){if(itr->first % 2 != 0){m_sailing[itr->first] = itr->second;}}
}void KafkaPusher::display()
{for(auto itr = m_sailing.begin(); itr != m_sailing.end(); ++itr){printf("%d:%.3f, ", itr->first, itr->second);}printf("\n[%s:%d]\n", __FILE__, __LINE__);
}
#ifndef RABBITMQPUSHER_H
#define RABBITMQPUSHER_H
#include "observer.h"class RabbitMQPusher : public Observer
{
public:RabbitMQPusher();void update(std::map<int, double> msgPoints) override;void display();private:std::map<int, double> m_engine;
};#endif // RABBITMQPUSHER_H#include "rabbitmqpusher.h"RabbitMQPusher::RabbitMQPusher()
{}void RabbitMQPusher::update(std::map<int, double> msgPoints)
{for(auto itr = msgPoints.begin(); itr != msgPoints.end(); ++itr){if(itr->first % 2 == 0){m_engine[itr->first] = itr->second;}}
}void RabbitMQPusher::display()
{for(auto itr = m_engine.begin(); itr != m_engine.end(); ++itr){printf("%d:%.3f, ", itr->first, itr->second);}printf("\n[%s:%d]\n", __FILE__, __LINE__);
}
#ifndef SUBSCRIBER_H
#define SUBSCRIBER_H#include <list>
#include "observer.h"class Subscriber
{
public:Subscriber();void registerObserver(Observer* obItem);void removeObserver(Observer* obItem);virtual void notify() = 0;protected:std::list<Observer*> m_listObserver;
};#endif // SUBSCRIBER_H#include "subscriber.h"Subscriber::Subscriber()
{}void Subscriber::registerObserver(Observer* obItem)
{m_listObserver.push_back(obItem);
}void Subscriber::removeObserver(Observer* obItem)
{m_listObserver.remove(obItem);
}
#ifndef WORKER_H
#define WORKER_H#include <map>
#include <list>
#include "subscriber.h"class Worker : public Subscriber
{
public:Worker();void notify() override;void alterOperationPoints(std::map<int, double> op);private:std::map<int, double> m_OperatePoints;
};#endif // WORKER_H#include "worker.h"
#include <cstdlib>
#include <ctime>Worker::Worker()
{}void Worker::notify()
{std::list<Observer*>::iterator itr;for(itr = m_listObserver.begin(); itr != m_listObserver.end(); ++itr){(*itr)->update(m_OperatePoints);}
}void Worker::alterOperationPoints(std::map<int, double> op)
{srand(time(0));for(int i = 51; i <= 60; i++){int random_number = rand() % 100 + 1;printf("%d ", random_number);m_OperatePoints[i] = random_number;}printf("\n");notify();
}
#include <iostream>
#include <unistd.h>
#include "worker.h"
#include "kafkapusher.h"
#include "rabbitmqpusher.h"using namespace std;int main()
{KafkaPusher kPush;RabbitMQPusher rPush;Worker worker;worker.registerObserver(&kPush);worker.registerObserver(&rPush);std::map<int, double> bigData;while (true) {worker.alterOperationPoints(bigData);kPush.display();rPush.display();sleep(2);}cout << "==Over==" << endl;return 0;
}
相关文章:
Design patterns--观察者模式
设计模式之观察者模式 代码示例 #ifndef OBSERVER_H #define OBSERVER_H#include <map>class Observer { public:Observer();virtual void update(std::map<int, double>) 0; }; #endif // OBSERVER_H#include "observer.h"Observer::Observer() {}#if…...
【Spring Boot】SpringBoot 单元测试
SpringBoot 单元测试 一. 什么是单元测试二. 单元测试的好处三. Spring Boot 单元测试单元测试的实现步骤 一. 什么是单元测试 单元测试(unit testing),是指对软件中的最⼩可测试单元进⾏检查和验证的过程就叫单元测试。 二. 单元测试的好处…...
ansible 调研
参考:自动化运维工具——ansible详解(一) - 珂儿吖 - 博客园 (cnblogs.com) ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点…...
QT UI控件汇总介绍
按钮 ToolButton 和pushbutton没什么区别,可以用来设置图标 设置展示策略 RadioButton 一般用Container可以将其框起来设置互斥域,推荐选用GroupBox 使用方法 qDebug()<<ui->radioButton_3->isChecked(); CheckBox 可以勾选三态 stat…...
【垃圾回收概述及算法】
文章目录 1. 垃圾回收概述及算法2. 垃圾回收相关算法2.1 标记阶段:引用计数算法2.2 标记阶段:可达性分析算法2.3 对象的 finalization 机制2.3.1 一个对象是否可回收的判断 2.4 清除阶段:标记-清除算法2.5 清除阶段:复制算法2.6 清…...
2021年03月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python编程(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 对于字典infor {“name”:“tom”, “age”:13, “sex”:“male”},删除"age":13键值对的操作正确的…...
为什么通过一致性正则化方法就可以避免将所有未标记数据集分配给同一类?
一致性正则化方法可以帮助避免将所有未标记数据分配给同一类别的原因在于它们引入了对模型输出的一致性约束,从而减轻了判别性损失(如交叉熵损失)可能导致的问题。以下是一些关键原因: 一致性反馈: 一致性正则化方法…...
第4章 决策树
文章目录 4.1 基本流程4.2 划分选择4.2.1 信息增益4.2.2 增益率4.2.3 基尼指数 4.3 剪枝处理4.3.1 预剪枝4.3.2 后剪枝 4.4 连续与缺失值4.4.1 连续值处理4.4.2 缺失值处理 4.5 多变量决策树4.6 阅读材料 4.1 基本流程 决策树也称判定树,是一类常见的机器学习方法。…...
在Remix中编写你的第一份智能合约
智能合约简单来讲就是:部署在去中心化区块链上的一个合约或者一组指令,当这个合约或者这组指令被部署以后,它就不能被改变了,并会自动执行,每个人都可以看到合约里面的条款。更深层次的理解就是:这些代码会…...
如何查看dll文件内导出函数名称
一 使用VS自带工具 进入VS开发环境,然后Tools -> Visual studio 2017 Command Prompt,打开兼容工具命令提示符, 如果工具 目录下没有命令行提示,可以从开始菜单找到VS的命令行提示符。 cd到dll所在目录,输入命令…...
学习笔记|串口通信的基础知识|同步/异步|RS232|常见的串口软件的参数|STC32G单片机视频开发教程(冲哥)|第二十集:串口通信基础
目录 1.串口通信的基础知识串口通信(Serial Communication)同步/异步?全双工?常见的串口软件的参数 2.STC32的串口通信实现原理引脚选择:实现分时复用模式选择串口1模式1,模式1波特率计算公式 3.串口通信代码实现编写串口1通信程序…...
JAVA String 和 String[][]互转的两种方法
第一种方法: <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.40</version> </dependency>字符串转数组: String s "[[22,23,23],[1,10,20]]"…...
推荐几个制作svg的工具
以下是一些用于制作SVG(可缩放矢量图形)的工具和软件,适用于不同技能级别和需求: Adobe Illustrator:作为业界标准之一,Adobe Illustrator是功能强大的矢量图形编辑软件,适用于专业设计师和创意…...
Java实现防重复提交,使用自定义注解的方式
目录 1.背景 2.思路 3.实现 创建自定义注解 编写拦截器 4.使用 5.验证...
Springboot实现Web组件注册
一、前言 在实际开发中,有时候我们可能使用springboot注册web组件,实现某些功能,比如我们需要生成一些api来提供对外的服务,而对应的路径其实是不固定的,那么这种情况下,其实是可以通过这种方式来注册web组…...
Element组件案例 Vue路由 前端打包部署步骤
目录 Element组件案例案例需求与分析环境搭建整体布局顶部标题左侧导航栏核心-右侧导航栏表格编写表单编写分页工具栏编写 异步数据加载异步加载数据性别展示修复图片展示修复 Vue路由Vue路由简介Vue路由入门 打包部署前端工程打包部署前端工程nginx介绍部署 Element组件案例 …...
mysql5.7停止维护时间
mysql5.7将于2023年10月停止官网支持和更新;老项目要准备升级,新项目的mysql必须是mysql8.0(2023-10) 官方升级咨询地址 oracle官方升级咨询地址https://go.oracle.com/LP116153?elq_mid247718&sh1518132002061316121320310…...
解密.kat6.l6st6r勒索病毒:保护数据的关键方法
导言: 网络威胁如雨后春笋,而 .kat6.l6st6r 勒索病毒则是其中一个异常狡猾的恶棍。本文91数据恢复将深入探讨 .kat6.l6st6r 勒索病毒的特点、数据恢复方法以及如何有效地预防这一数字威胁。 数据的重要性不容小觑,您可添加我们的技术服务号&a…...
Godot 添加信号
前言 Godot 里面C#和GDScirpt 的用法完全不一样,网上相关资料太少了。 什么是信号 信号分为信号源,触发,目的节点。信号源在某些条件下触发信号,比如按钮点击,鼠标悬停等事件 #mermaid-svg-wyr9ARVcBFmUUu8y {font-…...
JS如何判断文字是否溢出(被ellipsis)?
如果想要文本超出宽度后用省略号省略,只需要加上以下的css就行了。 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }3行css搞定,但是问题来了:如果我们想要当文本被省略的时候,也就是当文本超出指定…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
