多任务响应2(Qt)

news2025/4/16 13:46:21

多任务响应2

  • 扩展方案
  • 1. 设计思路
  • 2. 示例代码
  • 3. 说明

在多任务响应1的基础上,当任务响应比较复杂时,需要整合多个模块的信息。

扩展方案

利用【中介者模式】或【系统上下文】来整合多个模块的信息,并在命令对象中通过依赖注入(Dependency Injection)的方式获取这些模块的接口。这样,复杂响应的命令对象就可以根据需要同时访问多个模块,从而实现更复杂的业务逻辑。同时,这种设计依然满足模块化和解耦的要求,便于后续扩展和维护。

1. 设计思路

(1)创建模块接口
为各个具体业务模块定义接口(例如 IModuleA、IModuleB),以便于命令对象只依赖于接口而非具体实现。

(2)构建系统上下文
建立一个系统上下文(SystemContext)类来汇集所有模块的指针或者引用。通过将上下文注入到命令对象中,命令可以便捷地获取多个模块的信息,完成复杂的业务响应。

(3)实现复杂命令
复杂命令(例如 ComplexCommand)将依赖 SystemContext,在 execute() 方法中调用所依赖的各个模块,从而实现跨模块的信息整合与操作。

(4)信号槽结合
在 Qt 的信号槽机制中,按键的响应仍然通过 lambda 表达式调用 CommandManager 的 executeCommand()。而 CommandManager 内部已经注册了需要复杂响应的命令,该命令已被注入 SystemContext,从而可以访问所有必要模块。

2. 示例代码

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
#include <QString>
#include <unordered_map>
#include <memory>

// ==========================
// 1. 定义基础命令接口
class ICommand {
public:
    virtual ~ICommand() = default;
    virtual void execute() = 0;
};

// ==========================
// 2. 定义模块接口和实现

// 模块A接口和实现(例如负责生产某种数据)
class IModuleA {
public:
    virtual ~IModuleA() = default;
    virtual QString getInfoA() const = 0;
};

class ModuleA : public IModuleA {
public:
    QString getInfoA() const override {
        return "ModuleA 数据";
    }
};

// 模块B接口和实现(例如负责控制硬件或执行特定操作)
class IModuleB {
public:
    virtual ~IModuleB() = default;
    virtual QString getInfoB() const = 0;
};

class ModuleB : public IModuleB {
public:
    QString getInfoB() const override {
        return "ModuleB 数据";
    }
};

// ==========================
// 3. 定义系统上下文,将各模块整合到一起

class SystemContext {
public:
    SystemContext(IModuleA* modA, IModuleB* modB)
        : moduleA(modA), moduleB(modB) {}

    IModuleA* getModuleA() const { return moduleA; }
    IModuleB* getModuleB() const { return moduleB; }

private:
    IModuleA* moduleA;
    IModuleB* moduleB;
};

// ==========================
// 4. 实现一个复杂命令,该命令依赖多个模块的信息

class ComplexCommand : public ICommand {
public:
    // 注入 SystemContext
    ComplexCommand(SystemContext* ctx) : context(ctx) {}

    void execute() override {
        // 从上下文中获取各模块信息
        QString infoA = context->getModuleA()->getInfoA();
        QString infoB = context->getModuleB()->getInfoB();

        qDebug() << "执行复杂命令,整合信息: " << infoA << "和" << infoB;

        // 此处可以添加更复杂的逻辑,例如数据交互、状态修改等。
    }

private:
    SystemContext* context;
};

// ==========================
// 5. 命令管理器:注册并根据名称调度命令

class CommandManager {
public:
    using CommandPtr = std::unique_ptr<ICommand>;

    // 注册命令,commandName 为标识符
    void registerCommand(const QString &commandName, CommandPtr command) {
        commands_[commandName] = std::move(command);
    }

    // 根据命令名称执行对应命令
    void executeCommand(const QString &commandName) {
        auto it = commands_.find(commandName);
        if (it != commands_.end()) {
            it->second->execute();
        } else {
            qWarning() << "未找到命令:" << commandName;
        }
    }

private:
    std::unordered_map<QString, CommandPtr> commands_;
};

// ==========================
// 6. 主函数中构建各模块、上下文、注册命令并连接信号

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建主窗口与布局
    QWidget window;
    window.setWindowTitle("数控软件复杂响应示例");
    QVBoxLayout *layout = new QVBoxLayout(&window);

    // 创建示例按钮:简单命令和复杂命令
    QPushButton *btnSimple = new QPushButton("简单命令");
    QPushButton *btnComplex = new QPushButton("复杂命令");

    layout->addWidget(btnSimple);
    layout->addWidget(btnComplex);

    // 初始化 CommandManager
    CommandManager commandManager;

    // 注册一个简单命令作为对比(例如启动命令)
    class SimpleCommand : public ICommand {
    public:
        void execute() override {
            qDebug() << "执行简单命令:启动操作";
        }
    };

    commandManager.registerCommand("simple", std::make_unique<SimpleCommand>());

    // 构建各个模块实例(实际项目中一般为单例或通过依赖注入框架管理)
    auto moduleA = std::make_unique<ModuleA>();
    auto moduleB = std::make_unique<ModuleB>();

    // 构建系统上下文,注入各模块接口
    SystemContext context(moduleA.get(), moduleB.get());

    // 注册复杂命令,并将 SystemContext 注入命令中
    commandManager.registerCommand("complex", std::make_unique<ComplexCommand>(&context));

    // 连接按钮信号,通过 lambda 表达式调用 CommandManager 的执行接口
    QObject::connect(btnSimple, &QPushButton::clicked, [&commandManager]() {
        commandManager.executeCommand("simple");
    });
    QObject::connect(btnComplex, &QPushButton::clicked, [&commandManager]() {
        commandManager.executeCommand("complex");
    });

    window.show();
    return app.exec();
}

3. 说明

  • 模块接口与实现
    为 ModuleA 和 ModuleB 分别定义了接口 IModuleA/IModuleB,并提供了简单的示例实现。实际项目中,这些模块可能负责数据采集、硬件控制、状态监控等复杂任务。

  • 系统上下文(SystemContext)
    将所有模块聚合在一个上下文对象中后,可以在复杂命令中直接获取到所有需要的信息,这样即使复杂命令跨越多个模块,也不需要频繁修改命令接口。

  • 复杂命令 ComplexCommand
    通过构造函数注入 SystemContext,在 execute() 中直接访问各模块信息,并根据获得的信息来实现需要的业务逻辑。

  • 命令管理器与信号槽
    与前面的命令模式示例类似,CommandManager 依旧负责注册和调用命令。按钮点击后,通过 lambda 表达式调用相应命令的 execute() 方法。这样,UI 部分无需关心具体的模块依赖问题,所有复杂逻辑都封装在命令对象内部。

  • 扩展性
    如果将来某个功能响应需要更多模块,只需在 SystemContext 中添加相应模块或扩展接口即可;同时,相应的命令类也可以做相应调整,而无需改动其他模块或 CommandManager 的实现。

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

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

相关文章

无人机气动-结构耦合技术要点与难点

一、技术要点 1. 多学科耦合建模 气动载荷与结构响应的双向耦合&#xff1a;气动力&#xff08;如升力、阻力、力矩&#xff09;导致结构变形&#xff0c;而变形改变气动外形&#xff0c;进一步影响气流分布&#xff0c;形成闭环反馈。 建模方法&#xff1a; 高精度C…

element-ui plus 中 filter-method 函数多次触发问题解决

前情提要 点进这个文章的小伙伴&#xff0c;应该都是为了解决一个需求&#xff0c;把原本的前端过滤改为后端过滤&#xff0c;但是将filter-method修改为后端取数据后&#xff0c;发现其触发了很多次。博主也是在修改表格过滤时用到了这个坑&#xff0c;本篇文章为大家解决一下…

基于【Lang Chain】构建智能问答系统的实战指南

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Lang Chain 2、LangChain在问答系统中的核心优…

TestHubo安装及入门指南

TestHubo是一款开源免费的测试管理工具&#xff0c;提供一站式测试解决方案&#xff0c;涵盖功能测试、接口测试、性能测试以及 Web 和 App 测试等多个维度。TestHubo 整合了全面的测试能力&#xff0c;使团队可以在一个平台内完成所有测试需求。本文将介绍如何快速安装配置及入…

react tailwindcss最简单的开始

参考教程&#xff1a; Install Tailwind CSS with Vite - TailwindCSS中文文档 | TailwindCSS中文网https://www.tailwindcss.cn/docs/guides/vite操作过程&#xff1a; Microsoft Windows [版本 10.0.26100.3476] (c) Microsoft Corporation。保留所有权利。D:\gitee\tailwi…

openGauss新特性 | 自动参数化执行计划缓存

目录 自动化参数执行计划缓存简介 SQL参数化及约束条件 一般常量参数化示例 总结 自动化参数执行计划缓存简介 执行计划缓存用于减少执行计划的生成次数。openGauss数据库会缓存之前生成的执行计划&#xff0c;以便在下次执行该SQL时直接使用&#xff0c;可…

3、组件:魔法傀儡的诞生——React 19 组件化开发全解析

一、开篇&#xff1a;魔法傀儡的觉醒 "每个React组件都像一具魔法傀儡&#xff0c;"邓布利多校长挥动魔杖&#xff0c;空中浮现出闪烁的代码字符&#xff0c;"它们能自主思考、协同工作&#xff0c;甚至能跨越时空&#xff08;服务器与客户端&#xff09;执行任…

达梦数据库迁移问题总结

更多技术博客&#xff0c;请关注微信公众号&#xff1a;运维之美 问题一、DTS工具运行乱码 开启图形化 [rootlocalhost ~]# xhost #如果命令不存在执行sudo yum install xorg-x11-server-utils xhost: unable to open display "" [rootlocalhost ~]# su - dmd…

OpenHarmony荷兰研习会回顾 | 仓颉语言赋能原生应用开发实践

近日&#xff0c;由全球顶级学术峰会EuroSys/ASPLOS和OpenHarmony社区在荷兰鹿特丹合办的操作系统深度研习会圆满收官&#xff0c;本次研习会以"架构探秘-开发实践-创新实验"三位一体的进阶模式&#xff0c;为全球开发者构建了沉浸式技术探索平台。其中&#xff0c;由…

RV1126 人脸识别门禁系统解决方案

1. 方案简介 本方案为类人脸门禁机的产品级解决方案,已为用户构建一个带调度框架的UI应用工程;准备好我司的easyeai-api链接调用;准备好UI的开发环境。具备低模块耦合度的特点。其目的在于方便用户快速拓展自定义的业务功能模块,以及快速更换UI皮肤。 2. 快速上手 2.1 开…

matlab内置的git软件版本管理功能

1、matlab多人协作开发比普通的嵌入式软件开发困难很多 用过matlab的人都知道,版本管理对于matlab来说真的很费劲,今天介绍的这个工具也不是说它就解决了这个痛点,只是让它变得简单一点。版本管理肯定是不可或缺的,干就完了 2、操作说明 如图所示,源代码管理,选项罗列的…

《前端面试题之 CSS篇(第一集)》

目录 1、CSS的盒模型2、CSS选择器及其优先级3、隐藏元素的方法有那些4、px、em、rem的区别及使用场景5、重排、重绘有什么区别6、水平垂直居中的实现7、CSS中可继承与不可继承属性有哪些8、Sass、Less 是什么&#xff1f;为什么要使用他们&#xff1f;9、CSS预处理器/后处理器是…

MySQL部分总结

mysql学习笔记&#xff0c;如有不足还请指出&#xff0c;谢谢。 外连接&#xff0c;内连接&#xff0c;全连接 外连接&#xff1a;左外、右外 内连接&#xff1a;自己和自己连接 全连接&#xff1a;左外连接右外链接 mysql unique字段 unique可以在数据库层面避免插入相同…

Linux Kernel 2

地址空间&#xff08;Address Space&#xff09; 一、物理地址空间&#xff08;Physical Address Space&#xff09; 物理地址空间 是指 RAM 和设备内存 在系统内存总线上所呈现的地址布局。 举例&#xff1a;在典型的 32 32 32 位 Intel 架构中&#xff0c; RAM&#xff08…

AndroidTV D贝桌面-v3.2.5-[支持文件传输]

AndroidTV D贝桌面 链接&#xff1a;https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D贝桌面-v3.2.5[支持文件传输] 第一次使用的话&#xff0c;壁纸默认去掉的&#xff0c;不需要按遥控器上键&#xff0c;自己更换壁纸即可

线性方程组的解法

文章目录 线性方程组的解法认识一些基本的矩阵函数MATLAB 实现机电工程学院教学函数构造1.高斯消元法2.列主元消去法3. L U LU LU分解法 线性方程组的解法 看到以下线性方程组的一般形式&#xff1a;设有以下的 n n n阶线性方程组&#xff1a; A x b \mathbf{Ax}\mathbf{b} A…

Python赋能量子计算:算法创新与应用拓展

量子计算与Python结合的算法开发与应用研究 摘要 量子计算作为计算机科学的前沿技术,凭借其独特的计算能力在解决复杂问题方面展现出巨大潜力。Python作为一种高效、灵活的编程语言,为量子计算算法的开发提供了强大的支持。本文从研究学者的视角,系统探讨了量子计算与Pytho…

Java学习笔记(多线程):ReentrantLock 源码分析

本文是自己的学习笔记&#xff0c;主要参考资料如下 JavaSE文档 1、AQS 概述1.1、锁的原理1.2、任务队列1.2.1、结点的状态变化 1.3、加锁和解锁的简单流程 2、ReentrantLock2.1、加锁源码分析2.1.1、tryAcquire()的具体实现2.1.2、acquirQueued()的具体实现2.1.3、tryLock的具…

【软考系统架构设计师】系统配置与性能评价知识点

1、 常见的性能指标 主频外频*倍频 主频1/CPU时钟周期 CPI&#xff08;Clock Per Instruction&#xff09;平均每条指令的平均时间周期数 IPC&#xff08;Instruction Per Clock&#xff09;每时钟周期运行指令数 MIPS百万条指令每秒 MFLOPS百万个浮点操作每秒 字长影响运算的…

解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南

AI生图自由&#xff01;就来 ChatTools (https://chat.chattools.cn)&#xff0c;畅享Midjourney免费无限绘画。同时体验GPT-4o、Claude 3.7 Sonnet、DeepSeek等强大模型。 为了帮助大家更好地驾驭Midjourney&#xff0c;我们精心整理并分类了大量常用且效果出众的提示词。无论…