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

pie*_*ere 9 c# undo undo-redo redo

嗨,我即将为我正在编写的应用程序添加新功能.我需要写一个undo/redo功能.但是,我们90%的应用程序已经准备就绪,我不知道在没有已经创建的代码(太多)的情况下实现此功能的最佳方法是什么.

Ree*_*sey 8

这里的细节不多.但是,撤消/重做功能通常通过命令模式的某些变体来处理.根据您的体系结构,这可以简单地将您的基本功能重新编写为"命令"或重大改造.

  • 如果原始架构师/开发人员在他们第一次开始设计系统时没有想到这一点,我倾向于这是一次重大改革! (3认同)

ArB*_*rBR 7

正如Reed Copsey所说,实现do/redo最常见的模式是命令模式.基本思想是将操作实现为执行某些接口的命令,如下所示:

public interface ICommand  { public void Execute(); public void Undo(); }
Run Code Online (Sandbox Code Playgroud)

然后你有一个类(Control)作为一个整体执行所有命令,这样的类必须由一组命令组成,当你执行命令时,每个命令被推入一个Stack(通过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(); }        
        }       
    }   
}
Run Code Online (Sandbox Code Playgroud)

注意:这是一个非常简单的代码,仅用于尝试澄清命令模式背后的想法.

链接文字