как реализовать операцию отмены / возврата без значительных изменений в программе - PullRequest
9 голосов
/ 20 октября 2010

Привет Я собираюсь добавить новую функциональность в приложение, которое я сейчас пишу. Мне нужно написать функцию отмены / возврата. Однако 90% нашего приложения готовы, и я не знаю, каков наилучший способ реализации этой функциональности без уже созданного (слишком большого) кода.

Ответы [ 5 ]

8 голосов
/ 20 октября 2010

Здесь не так много деталей. Тем не менее, функциональность Undo / Redo обычно обрабатывается с помощью некоторого варианта Command Pattern . В зависимости от вашей архитектуры это может быть простая переработка основных функций в «команды» или капитальный ремонт.

7 голосов
/ 20 октября 2010

Как Рид Копси говорит, что наиболее распространенным шаблоном для реализации do / redo является Шаблон команды .Основная идея состоит в том, чтобы реализовать действия как команды, которые реализуют некоторый интерфейс, подобный следующему:

public interface ICommand  { public void Execute(); public void Undo(); }

Тогда у вас есть класс (Control), который выполняет все команды в целом, такой класс должен быть составлен группойкоманд, когда вы выполняете команды, каждая команда помещается в стек (с помощью метода push()), в случае, если вы хотите отменить действия, вы берете каждый элемент из стека (с помощью pop()) a выполняет свой метод Undo().

public class Control {  
    private ArrayList<ICommand> commands  = new ArrayList<ICommand>();  
    private Stack<ICommand> stack = new Stack<ICommand>();  

    public Control() {      
        commands.add(new Command1());
        commands.add(new Command2());       
        commands.add(new Command3());       
    }

    public void Execute() {
        for(int index=0; index<=command.size(); index++) { command.Execute(); stack.push(command);}
    }
    public void Undo() 
    {
        while (!stack.empty()) {
            ICommand command = (ICommand)stack.pop();
            if (command != null) { command.Undo(); }        
        }       
    }   
}

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

текст ссылки

0 голосов
/ 20 октября 2010

Существует бесплатная библиотека , написанная Rockford Lhotka для Business Objects, которая включает в себя встроенную функцию отмены / возврата. Я думаю, что он даже реализует это через интерфейс, поэтому он должен быть «минимально инвазивным».

0 голосов
/ 20 октября 2010

Вам понадобится стек отмены / повтора и серьезные изменения, чтобы все узнали об этом стеке. Извините, но магии не существует: /

0 голосов
/ 20 октября 2010

Пара вопросов: что делает отмена? Отменяет ли он все изменения или только последнее?

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

Повторить будет той же концепцией, но она сохранит состояние, предшествующее отмене.

...