嗨,我即将向我目前正在编写的应用程序添加新功能。我需要编写撤消/重做功能。但是,我们 90% 的应用程序已经准备好,我不知道在没有已经创建的影响(太多)代码的情况下实现此功能的最佳方法是什么。
问问题
8416 次
3 回答
8
这里没有太多细节。但是,撤消/重做功能通常通过命令模式的一些变体来处理。根据您的体系结构,这可能是将您的基本功能简单地改造成“命令”,或者进行大修。
于 2010-10-19T23:21:08.847 回答
8
正如Reed Copsey所说,实现 do/redo 的最常见模式是命令模式。基本思想是将动作实现为实现如下接口的命令:
public interface ICommand { public void Execute(); public void Undo(); }
然后你有一个整体执行所有命令的类(控制),这样的类必须由一组命令组成,当你执行命令时,每个命令都被推入堆栈(通过push()
方法),在如果您想撤消操作,那么您从堆栈中获取每个元素(通过pop()
)并执行其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(); }
}
}
}
注意:这是一个非常简单的代码,仅用于阐明命令模式背后的思想。
于 2010-10-20T00:28:58.780 回答