Шаблон команды Отменить / Повторить: Есть ли проблемы с моим подходом? - PullRequest
2 голосов
/ 06 января 2011

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

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 для последующих изменений процесса, тогда как другой способ можно было бы вызывать без необходимости использования команды и обрабатывать все так же (это может иметь отрицательные последствия). для отслеживания шагов отмены / повтора). Я обдумываю это? Куда бы вы его положили и почему (очевидно, этот пример охватывает не все углы, а какие-либо общие рекомендации по шаблону команд?).

1 Ответ

2 голосов
/ 06 января 2011

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

для отмены / повтора вам понадобится список или два для команд.

звучит так, будто ваш иерархический объект может быть http://en.wikipedia.org/wiki/Composite_pattern,, поэтому взгляните на макрос-команду в книге «Банды четырех». также обзор: http://en.wikipedia.org/wiki/Command_pattern.

Кристофер Александер говорит: «Каждый шаблон описывает проблему, которая возникает снова и снова в нашей среде, а затем описывает ядро ​​решения этой проблемы таким образом, что вы можете использовать это решение миллион раз, никогда не делая это одинаково дважды ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...