命令模式,需要在执行前创建新命令

时间:2016-05-18 09:55:04

标签: command-pattern

我在一个应用程序中使用命令模式,我有以下问题: 某些命令在执行之前需要创建另一个命令。 创建新命令的需要取决于应用程序的状态,因此我无法解决在向队列添加命令时是否创建新命令,但我需要在执行它们之前解决它。 具体来说,我制作命令来控制一个策略游戏。我有命令升级建筑。它需要资源。 当资源价格高于我的存储容量时,程序应解析它并在实际升级构建之前插入用于升级资源存储的命令。这就是为什么在将此命令添加到队列时无法解决升级存储的需要的原因,因为该命令可在多天后执行,并且存储级别将随时间而变化。 我想到的唯一选择是在命令之前插入新命令,这需要比我的存储中更多的资源,并从头开始重新执行命令队列,但这是非常难看的解决方案。 是否有一些设计模式只有在命令首先在队列中执行时才解决命令依赖关系,并在执行此命令之前插入这些依赖关系? 我需要添加命令以将存储升级到队列,因此当我目前没有资源来升级存储时,可以将它们保留以便以后执行。 队列处理逻辑所在的My QueueConsumer如下所示:

public function processQueue()
{
    $failedCommands = [];
    $success = false;
    $queue = $this->queueManager->getQueue();
    foreach ($queue as $key => $command) {
        foreach ($this->processors as $processor) {
            if ($processor->canProcessCommand($command)) {
                $success = $processor->processCommand($command);
                //in the processCommandMethod I am able to resolve whether I need new commands (need to upgrade storages) or not
                break;
            }
        }
        if ($success) {
            $this->queueManager->removeFromQueue($command->getUuid());
        } else {
            $failedCommands[] = $command;
            break;
        }
    }
    if (count($failedCommands) > 0) {
    //determine when the failed commands could be processed succesfully (enough resources and so on).
    }
}

1 个答案:

答案 0 :(得分:0)

你能使用IoC容器吗?它将为您解决所有家属。