Я хочу реализовать шаблон команды для поддержки отмены / повтора в моем приложении. Данные очень тесно связаны друг с другом, поэтому есть некоторые последующие последствия изменения некоторых из моих объектов, которые я также хочу отменить. Моя главная проблема заключается в том, где я должен поместить код, который выполняет последующие команды. Например:
class:MoveObjectCommand
{
private hierarchicalObject:internalObject;
public MoveObjectCommand(hierarchicalObject:newObject)
{
internalObject = newObject;
}
public Execute()
{
internalObject.Location = someNewLocation;
foreach(hierarchicalObject:child in internalObject.Children)
{
if(someNewLocation = specialPlace)
{
var newCommand:MoveObjectCommand = new MoveObjectCommand(child)
CommandManager.add(newCommand);
}
}
}
public Undo()
{
internalObject.location = oldLocation;
}
}
Насколько я могу судить, что-то вроде этого будет работать нормально, но я не могу понять, куда на самом деле должна идти большая часть кода выполнения. Должен ли иерархический объект иметь метод .changeLocation (), который добавляет все последующие команды, или они должны быть в самой команде, как указано выше? Единственное различие, о котором я могу думать, состоит в том, что в приведенном выше примере пришлось бы вызывать MoveObjectCommand для последующих изменений процесса, тогда как другой способ можно было бы вызывать без необходимости использования команды и обрабатывать все так же (это может иметь отрицательные последствия). для отслеживания шагов отмены / повтора). Я обдумываю это? Куда бы вы его положили и почему (очевидно, этот пример охватывает не все углы, а какие-либо общие рекомендации по шаблону команд?).