Как Рид Копси говорит, что наиболее распространенным шаблоном для реализации 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(); }
}
}
}
Примечание : это очень простой код, предназначенный только для разъяснения идей, лежащих в основе шаблона команд.
текст ссылки