如何在程序没有重大改变的情况下实现撤消/重做操作

你好 我即将为我正在编写的应用程序添加新功能。我需要写一个undo / redo功能。但是,我们90%的应用程序已经准备就绪,我不知道在没有已经创建的代码(太多)的情况下实现此功能的最佳方法是什么。     
已邀请:
这里的细节不多。但是,撤消/重做功能通常通过命令模式的某些变体来处理。根据您的体系结构,这可以简单地将您的基本功能重新编写为“命令”或重大改造。     
正如Reed Copsey所说,实现do / redo的最常见模式是命令模式。基本思想是将操作实现为执行某些接口的命令,如下所示:
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(); }        
        }       
    }   
}
注意:这是一个非常简单的代码,仅用于尝试澄清命令模式背后的想法。 链接文字     
几个问题:撤消有什么作用?它会撤消所有更改还是只撤消最后一个? 在任何情况下,您将首先存储输入字段的状态(初始状态或最后所需位置),然后撤消按钮将采用该状态并将其应用于字段。 重做将是相同的概念,但它将存储撤消之前的状态。     
你需要一个撤销/重做堆栈,并进行重大更改以使一切都知道这个堆栈..对不起,但魔法不存在:/     
Rockford Lhotka为Business Objects编写了一个免费库,其中包含内置的撤消/重做功能。我认为他甚至通过界面实现它,所以它应该是“微创的”。     

要回复问题请先登录注册