Я использую шаблон команды в одном моем приложении, и у меня есть следующая проблема: Некоторым командам нужны другие команды, которые должны быть созданы до их выполнения. Необходимость создания новых команд зависит от состояния приложения, поэтому я не могу решить, создавать ли новые команды при добавлении команд в очередь, но мне нужно разрешить их непосредственно перед их выполнением. В частности, я делаю команды для управления одной стратегической игрой. У меня есть команда для обновления здания. И это требует ресурсов. Когда цена ресурсов выше емкости моего хранилища, программа должна ее решить и вставить команды для обновления хранилищ ресурсов до фактического обновления здания. Вот почему я не могу решить проблему обновления хранилищ при добавлении этой команды в очередь, потому что команда может быть выполнена через много дней, и уровни хранилищ со временем меняются. Единственный вариант, который пришел мне на ум - вставить новые команды перед командой, которым требуется больше ресурсов, чем я могу иметь в своих хранилищах, и перезапустить выполнение очереди команд с самого начала, но это действительно уродливое решение. Существует ли какой-либо шаблон проектирования для разрешения зависимостей команд только тогда, когда команда выполняется в очереди в очереди и вставлять эти параметры перед выполнением этой команды? Мне нужно добавить команды для обновления хранилищ до очереди, чтобы они могли сохраняться для последующего выполнения, когда у меня нет ресурсов для обновления хранилищ. Мои 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).
}
}
Я, возможно, четко не выражал себя. Я использую контейнер Injection Dependency, у меня нет проблем с зависимостями в терминах классов обслуживания, но мне нужно разрешить зависимости в терминах некоторой команды, которая должна быть вставлена в очередь (потому что мне нужно сохранить новую добавленную команду для последующей обработки) перед текущей обработанной командой и выполненной перед ней. –
Может быть, вы можете перенести свою логику на конечный автомат. Вы могли бы рассматривать команды как алфавит SM –
В перерывах вы фактически выполняете логику. –