瑞星 发表于 2024-8-28 02:21:41

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

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



[*]场景: 当按键触发某些耗时操纵时,我们可以使用下令模式将这些操纵封装起来,委托给线程池执行,从而避免主线程的壅闭。
[*]改进:下令模式: 封装每个按键操纵为独立的下令对象,并将这些下令委托给线程池执行。如许可以确保耗时操纵不会壅闭主线程,并且可以轻松实现操纵的撤销、重做等高级功能。
下令模式(Command Pattern)

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

在下令模式中,关键的到场者包括:


[*]下令(Command):下令是一个接口,声明了执行操纵的接口方法(通常是 execute() 方法)。
[*]具体下令(Concrete Command):具体下令类实现了 Command 接口,包含了一个吸取者对象(Receiver),并实现了该操纵。具体下令将吸取者对象和操纵绑定在一起,调用吸取者对象的操纵方法来实现下令的执行。
[*]吸取者(Receiver):吸取者是下令要操纵的对象,它包含现实执行下令的逻辑。具体下令调用吸取者的方法来完成请求。
[*]调用者(Invoker):调用者是使用下令对象的类,它调用下令对象的 execute() 方法来执行下令。
[*]客户端(Client):客户端创建并设置具体下令对象,并将吸取者对象与之关联。客户端还将下令对象通报给调用者。
下令模式的运作机制


[*]客户端创建具体下令对象,并将相应的吸取者对象通报给具体下令对象。
[*]调用者持有具体下令对象的引用,并在需要时调用下令对象的 execute() 方法。
[*]具体下令对象调用吸取者对象的方法来执行请求。
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(()
         {
   
            // 假设有个复杂的计算或操作基于 sourceInfo和sensorValue
            hardwareModule->performOperation(operationId,sourceInfo, sensorValue);
            
                        // 更新目标 ViewModel
            QMetaObject::invokeMethod(targetViewModel, () {
   
                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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 工业软件架构2:(QT和C++实现)