你好,我即将为我目前正在编写的应用程序添加新功能。我需要编写撤消/重做功能。然而,我们应用程序已完成了90%,我不知道在不影响已经创建的代码的情况下实现此功能的最佳方法。
你好,我即将为我目前正在编写的应用程序添加新功能。我需要编写撤消/重做功能。然而,我们应用程序已完成了90%,我不知道在不影响已经创建的代码的情况下实现此功能的最佳方法。
Reed Copsey所说的实现撤销/重做最常见的模式是命令模式。基本思路是将操作实现为命令,该命令实现类似于这样的接口:
public interface ICommand { public void Execute(); public void Undo(); }
您有一个类(Control),它作为整体执行所有命令,这样的类必须由一组命令组成,当您执行命令时,每个命令都会被推送到堆栈中(通过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(); }
}
}
}
注意: 这是一个非常简单的代码,仅用于尝试澄清命令模式背后的思想。
这里提供的信息不是很详细。然而,撤销/重做功能通常通过某种变体的命令模式来处理。根据您的架构,这可能只需要将基本功能重新构建为“命令”,或进行彻底的大改动。