Реализация отмены в Java для изменений состояния - PullRequest
2 голосов
/ 01 июля 2011

Я начинаю реализовывать шаблон команды в надежде найти полезное решение моей проблемы с предоставлением операции отмены. Сейчас я сталкиваюсь с определенной проблемой:

Реализация отмены, когда задействованы операции, довольно проста: когда я добавляю 5 к числу, я вычитаю 5. Когда я добавляю объект в список, я удаляю его и так далее. Но что, если у меня есть общее состояние, а не что-то вроде списка?

Пример: я моделирую информацию о потоке в классе:

public class ThreadInfo implements Comparable<ThreadInfo> {

    final int id;
    String name;
    int priority;
    String state;
    int waitCount;
    // ...
}

Некоторая информация не изменяется, например, идентификатор. Отменить waitCount просто, как описано выше, просто вычесть. Но как насчет priority или state? Не ясно, как отменить эту информацию.

Единственная идея, которая мне пришла в голову: при инициализации объекта команды сохранить старое состояние в его объекте: передав соответствующие данные в конструктор:

public MyCommand(int priority, String state) {
   previousPriority = priority;
   previousState = state;
}

Или лучше было бы ThreadInfo иметь список состояний и приоритетов, чтобы быть первыми элементами текущего?

Ответы [ 4 ]

4 голосов
/ 01 июля 2011

Просто держите старое состояние в команде.например

 class ChangeFoo {
    ChangeFoo (Bar bar, foo newFoo){}
    void execute(){
        oldFoo = bar.getFoo();
        bar.setFoo(newFoo);
    }
    void undo(){
        bar.setFoo(oldFoo);
    }
 }
2 голосов
/ 01 июля 2011

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

0 голосов
/ 01 июля 2011

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

0 голосов
/ 01 июля 2011

Java уже имеет поддержку операций отмены / возврата.Посмотрите этот учебник .Вы можете расширить класс AbstractUndoableEdit, чтобы определить семантику операций отмены / возврата на ваших объектах.

...