2016-05-18 4 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

Я, возможно, четко не выражал себя. Я использую контейнер Injection Dependency, у меня нет проблем с зависимостями в терминах классов обслуживания, но мне нужно разрешить зависимости в терминах некоторой команды, которая должна быть вставлена ​​в очередь (потому что мне нужно сохранить новую добавленную команду для последующей обработки) перед текущей обработанной командой и выполненной перед ней. –

+0

Может быть, вы можете перенести свою логику на конечный автомат. Вы могли бы рассматривать команды как алфавит SM –

+0

В перерывах вы фактически выполняете логику. –

 Смежные вопросы

  • Нет связанных вопросов^_^