赞
踩
命令模式是一种行为设计模式,它将一个请求封装为一个对象,从而使得你可以用不同的请求、队列或者日志来参数化其他对象。命令模式还支持撤销操作。
在命令模式中,关键的参与者包括:
首先,我们定义一个 Command 接口,该接口声明了 execute() 方法。
class Command
{
public:
virtual ~Command() {
}
virtual void execute() = 0;
};
具体命令实现了 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和sensorValue
hardwareModule->performOperation(operationId,sourceInfo, sensorValue);
// 更新目标 ViewModel
QMetaObject::invokeMethod(targetViewModel, [this, result]() {
targetViewModel->setParameter("resultKey", result);
}, Qt::QueuedConnection);
});
}
private:
Page1ViewModel *sourceViewModel;
Page2ViewModel *targetViewModel;
HardwareControlModule *hardwareModule;
int operationId;
};
调用者(Invoker)持有命令对象的引用,可以是一个用户界面按钮,也可以是另一个触发器。在需要执行命令时,调用者调用 execute() 方法。
在 ButtonHandlerModule 中,可以将按键操作绑定到命令对象,并在触发时执行命令。
void ButtonHandlerModule::handleButtonPress(int buttonId)
{
Comma
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。