工业软件架构2:(QT和C++实现)

工业软件架构 - 事件驱动 - 2

  • 1. 命令模式的使用
    • 命令模式(Command Pattern)
      • 命令模式的基本概念
      • 命令模式的运作机制
    • 1. 定义命令接口
    • 2. 实现具体命令
    • 3. 调用者类
    • 4.扩展命令模式的功能
      • 撤销命令:
      • 宏命令:
    • 总结
  • 2. MVVM 模式的使用
    • View(界面)部分则通过绑定与 ViewModel 交互:
  • 3. 页面导航模块的更新
    • 导航控制器(NavigationController)
    • 路由系统(Router)
  • 4. 综合架构更新
  • 5. 更新后的主程序集成
  • 6. 总结

在更复杂的场景中,比如按键响应包含耗时操作、每个界面参数的读取和写入需要独立处理、并且希望更清晰地组织代码,命令模式、页面导航、和 MVVM 模式将发挥重要作用。

1. 命令模式的使用

  • 场景: 当按键触发某些耗时操作时,我们可以使用命令模式将这些操作封装起来,委托给线程池执行,从而避免主线程的阻塞。
  • 改进:命令模式: 封装每个按键操作为独立的命令对象,并将这些命令委托给线程池执行。这样可以确保耗时操作不会阻塞主线程,并且可以轻松实现操作的撤销、重做等高级功能。

命令模式(Command Pattern)

命令模式是一种行为设计模式,它将一个请求封装为一个对象,从而使得你可以用不同的请求、队列或者日志来参数化其他对象。命令模式还支持撤销操作。

命令模式的基本概念

在命令模式中,关键的参与者包括:

  • 命令(Command):命令是一个接口,声明了执行操作的接口方法(通常是 execute() 方法)。
  • 具体命令(Concrete Command):具体命令类实现了 Command 接口,包含了一个接收者对象(Receiver),并实现了该操作。具体命令将接收者对象和操作绑定在一起,调用接收者对象的操作方法来实现命令的执行。
  • 接收者(Receiver):接收者是命令要操作的对象,它包含实际执行命令的逻辑。具体命令调用接收者的方法来完成请求。
  • 调用者(Invoker):调用者是使用命令对象的类,它调用命令对象的 execute() 方法来执行命令。
  • 客户端(Client):客户端创建并配置具体命令对象,并将接收者对象与之关联。客户端还将命令对象传递给调用者。

命令模式的运作机制

  1. 客户端创建具体命令对象,并将相应的接收者对象传递给具体命令对象。
  2. 调用者持有具体命令对象的引用,并在需要时调用命令对象的 execute() 方法。
  3. 具体命令对象调用接收者对象的方法来执行请求。

1. 定义命令接口

首先,我们定义一个 Command 接口,该接口声明了 execute() 方法。

class Command 
{
public:virtual ~Command() {}virtual void execute() = 0;
};

2. 实现具体命令

具体命令实现了 Command 接口,并将接收者对象与特定的操作绑定在一起。

class ExpensiveOperationCommand : public Command 
{
public:ExpensiveOperationCommand(SensorModule *sensorModule, int sensorId,Page1ViewModel *sourceViewModel, Page2ViewModel *targetViewModel,HardwareControlModule *hardwareModule, int operationId): sensorModule(sensorModule), sensorId(sensorId), sourceViewModel(sourceViewModel), targetViewModel(targetViewModel), hardwareModule(hardwareModule), operationId(operationId) {}void execute() override{// 获取源 ViewModel 的信息QVariant sourceInfo = sourceViewModel->getParameter("someKey");double sensorValue = sensorModule->getSensorData(sensorId);// 将耗时操作移到后台线程执行QtConcurrent::run([this](){// 假设有个复杂的计算或操作基于 sourceInfo和sensorValuehardwareModule->performOperation(operationId,sourceInfo, sensorValue);// 更新目标 ViewModelQMetaObject::invokeMethod(targetViewModel, [this, result]() {targetViewModel->setParameter("resultKey", result);}, Qt::QueuedConnection);});}private:Page1ViewModel *sourceViewModel;Page2ViewModel *targetViewModel;HardwareControlModule *hardwareModule;int operationId;
};

3. 调用者类

调用者(Invoker)持有命令对象的引用,可以是一个用户界面按钮,也可以是另一个触发器。在需要执行命令时,调用者调用 execute() 方法。
在 ButtonHandlerModule 中,可以将按键操作绑定到命令对象,并在触发时执行命令。

void ButtonHandlerModule::handleButtonPress(int buttonId) 
{Comma

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

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

相关文章

FFmpeg的入门实践系列三(基础知识)

欢迎诸位来阅读在下的博文~ 在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力 文章目录 前期博客一、音视频常用术语二、FFmpeg库的结构介绍三、FFmpeg的常用函数初始化封装格式编解码器相关 四、FFmpeg常用的数…

FastCGI简述

FastCGI (FCGI) 是一种协议,用于改善 Web 服务器和应用程序之间的通信效率。它是在 CGI(Common Gateway Interface)的基础上发展起来的,旨在解决 CGI 在处理大量并发请求时存在的性能问题。 CGI的由来 最早的Web服务器只能简单地…

WHAT - Jamstack(JavaScript, APIs, and Markup 与 Serverless 无服务器架构)

目录 一、介绍1. JavaScript2. APIs3. Markup4. Jamstack 的优势5. Jamstack 架构的工作流程 二、常见的 Jamstack 技术栈三、无服务器架构(Serverless)无服务器架构的核心概念1. 函数即服务(FaaS)2. 后端即服务(BaaS&…

解决 JS WebSocket 心跳检测 重连

解决 JS WebSocket 心跳检测 重连 文章目录 解决 JS WebSocket 心跳检测 重连一、WebSocket 心跳检测的作用二、心跳检测的处理方案1. 创建 WebSocket 连接2. 心跳参数设置3. 心跳检测逻辑4. 心跳包响应处理5. 断线重连机制 三、总结 一、WebSocket 心跳检测的作用 WebSocket 是…

序列化组件对比

1、msgpack介绍 1.MsgPack产生的数据更小,从而在数据传输过程中网络压力更小 2.MsgPack兼容性差,必须按照顺序保存字段 3.MsgPack是二进制序列化格式,兼容跨语言 官网地址: https://msgpack.org/ 官方介绍:Its lik…

C++ 移动构造函数为什么设置noexcept?

答案显然是&#xff1a; 移动构造函数设置了noexcept后STL的容器可以显著提高性能。 For example: class MyClass { public:MyClass(int v) { val v; }MyClass(const MyClass& o) {val o.val;std::cout << "Copy constructor " << val << …

Go 语言协程管理精解

1.基础 协程切换需要操作寄存器&#xff0c;这些操作需要通过汇编辅助实现。另外&#xff0c;每一个协程都有一个协程栈&#xff0c;实际上协程栈也是有结构的。汇编程序和栈结构这些概念可能大部分开发者都不太了解&#xff0c;在介绍协程管理之间&#xff0c;先简要介绍。 1…

一、undo log、Buffer Pool、WAL、redo log

目录 1、undo log2、Buffer Pool3、WAL4、redo log5、总结6、问题 1、undo log undo log日志是一种用于撤销回退的逻辑日志&#xff0c;在事务未提交前会记录相反的操作到undo log&#xff0c;当事务回滚&#xff0c;使用undo log 进行回滚&#xff0c;保证了事务的原子性。MV…

【生活英语】1、高兴与难过

【生活英语】1、高兴与难过 一、我非常非常开心二、心情三、不开心四、运气五、英语对话1、We broke up2、中奖了 一、我非常非常开心 (1) I’m really happy. (2) I’m really overjoyed. (3) I couldn’t be happier. I couldn’t agree with you more. 我非常赞同你。 (4) …

C++ TinyWebServer项目总结(8. 高性能服务器程序框架)

《Linux 高性能服务器编程》一书中&#xff0c;把这一章节作为全书的核心&#xff0c;同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后&#xff0c;正式进入了 Web 服务器项目的核心部分&#xff01; 前置内容回顾&#xff1a; 1. C TinyWebServer项目总结&…

每日一问:GET请求和POST请求的区别

每日一问&#xff1a;GET请求和POST请求的区别 在Web开发中&#xff0c;GET请求和POST请求是最常见的两种HTTP请求方法。尽管它们在功能上有许多相似之处&#xff0c;但在使用场景、数据传递方式、缓存策略等方面存在显著差异。了解这些区别不仅有助于我们在开发中做出正确的选…

Docker拉取镜像-2024-07-有效

Docker拉取镜像-有效 配置加速地址 首先&#xff0c;创建Docker配置目录&#xff1a;sudo mkdir -p /etc/docker然后&#xff0c;编辑daemon.json文件&#xff0c;添加以下加速地址&#xff1a;sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors"…

go gc信息如何查看

目录 1.几种常见方法1.1.设置环境变量 GODEBUG打印GC日志1.2.使用 debug.ReadGCStats1.3.使用 runtime.ReadMemStats 2.GC日志打印示例3.参考 在Go语言中&#xff0c;可以通过设置环境变量和使用运行时包中的调试功能来打印垃圾回收&#xff08;GC&#xff09;的信息。 1.几种…

等保测评中的安全测试方法

等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是我国网络安全领域的重要评估机制&#xff0c;用于验证网络系统或应用是否满足相应的安全保护等级要求。在等保测评中&#xff0c;安全测试方法扮演着至关重要的角色。本文将详细介绍等保测评中常用的安全测试方法及其…

LinkedHashMap和TreeMap的基本使用

一.LinkedHashMap集合&#xff1a;&#xff08;是HashMap集合的儿子&#xff0c;Map集合的孙子&#xff09; 1.特点&#xff1a; 2.代码实现&#xff1a; 1)键的唯一性&#xff1a; package com.itheima.a01myMap; ​ import java.util.LinkedHashMap; ​ public class A07_…

二十三种模式之单例模式(基础了解)

1.设计模式的分类 创建型模式(五种)&#xff1a;工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。结构型模式(七种)&#xff1a;适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。行为型模式(十一种)&#xff1a;状态模式、模板方法…

Flamingo中的Perceiver Resampler

在 Flamingo 模型中&#xff0c;Perceiver Resampler 是一个关键组件&#xff0c;用于将输入的多模态数据&#xff08;如图像和文本&#xff09;转化为适合Transformer处理的表示形式。具体来说&#xff0c;它是为了解决高维视觉输入&#xff08;如图像&#xff09;和低维语言表…

【Docker项目实战】使用Docker部署webtop桌面版Linux环境

【Docker项目实战】使用Docker部署webtop桌面版Linux环境 一、webtop介绍1.1 webtop简介1.2 主要特点1.3 使用场景二、webtop相关说明2.2 webtop支持架构2.2 镜像版本说明三、本地环境介绍3.1 本地环境规划3.2 本次实践介绍四、本地环境检查4.1 检查Docker服务状态4.2 检查Dock…

YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】

目录 一、训练yolov8模型&#xff0c;得到最佳权重文件best.pt 二、pt转onnx,即best.pt->best11.onnx 1、对下载的YOLOv8代码修改 2、加入模型导出功能&#xff0c; 3、导出指令采用如下代码 三、ONNX转RKNN 四、RK3588部署 1、拷贝rknn文件到rk3588板子内 2、执行…

48.x86游戏实战-封包抓取进图call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…