2016-05-18 96 views
1

我在一个应用程序中使用命令模式,我有以下问题: 某些命令在执行之前需要创建另一个命令。 创建新命令的必要性取决于应用程序的状态,所以我无法解决向队列添加命令时是否创建新命令,但是我需要在执行它们之前解决它。 具体来说,我制作命令来控制一个策略游戏。我有命令升级建筑。它需要资源。 当资源价格高于我的存储容量时,程序应该在实际升级建筑之前解决它并插入用于升级资源存储的命令。这就是为什么在将此命令添加到队列时我无法解决升级存储的需求,因为该命令可能会在多天后执行,并且存储级别会随着时间而改变。 我唯一的选择是在命令之前插入新命令,它需要比我的存储空间更多的资源,并从头开始重新启动命令队列,但这确实是一个非常难看的解决方案。 是否有一些设计模式仅在命令首次进入队列时才解析命令依赖关系,并在执行该命令之前插入这些依赖关系? 我需要添加命令将存储升级到队列,以便在我当前没有资源升级存储时可以保留它们以便稍后执行。 我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). 
    } 
} 

回答

0

你可以使用一个IoC容器?它会解决你的所有依赖。

+0

我没有明确地表达自己。我使用依赖注入容器,在服务类方面我没有依赖关系的问题,但是我需要解决一些命令插入到队列中的依赖关系(因为我需要保存新添加的命令以后处理)在当前处理的命令之前并在其之前执行。 –

+0

也许你可以将你的逻辑移动到状态机。你可以把这些命令当作SM –

+0

的字母表。 –