Шаблон команды: последовательное выполнение нескольких команд.

Я хочу выполнить серию команд, но только в том случае, если предыдущая команда была успешной. Прямо сейчас я вызываю событие в объекте команды, указывающее, была ли команда успешной или неудачной. Я использую это для управления выполнением, но это кажется неэлегантным.

Пример:

command1.CommandSucceeded += delegate { command2.Execute(); };
command1.Execute();

Это работает, но кажется неуклюжим и неинтуитивным. Я мог бы вернуть логическое значение Execute(), указывающее на успех или неудачу, но это по тому же пути. Я мог бы генерировать исключения при сбое, что могло бы привести к более чистому коду, но могло бы быть излишним.

Какие-либо предложения?


person Josh    schedule 26.08.2009    source источник


Ответы (2)


Я обошел это, настроив команду «цепочка». Я создал объект Command, который содержит другие команды, а затем запускает каждую из них по очереди при вызове Do. В вашем случае вы можете заставить команду вызывать делегата и запускать следующую команду в последовательности, только если она была успешной.

Один из способов сделать это, я полагаю.

person Michael Todd    schedule 26.08.2009
comment
Да, схема цепочки ответственности здесь полезна. - person pjp; 27.08.2009
comment
Не знал, что это так называется. Спасибо за информацию. - person Michael Todd; 27.08.2009
comment
Модель «Цепочка ответственности» кажется подходящей. Спасибо за ответ. - person Josh; 27.08.2009

Возврат логического значения или объекта, представляющего некоторый статус, не так уж и плох. Это может показаться неуклюжим, но это просто и понятно.

Одна реализация, которую я использую, выглядит примерно так:

Сначала я добавляю объекты Command в список.

List<ICommand> commands = new List<ICommand>;
commands.Add(command1);
commands.Add(command2);

Затем список объектов Command выполняется следующим образом:

foreach (ICommand command in commands)
{
  bool success = command.Execute();
  if (!success) break;
}
person Theo Lenndorff    schedule 26.08.2009