11

嗨,我即将向我目前正在编写的应用程序添加新功能。我需要编写撤消/重做功能。但是,我们 90% 的应用程序已经准备好,我不知道在没有已经创建的影响(太多)代码的情况下实现此功能的最佳方法是什么。

4

3 回答 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 回答
0

CSLA.NET是一个包含内置撤消/重做功能的业务逻辑库。我认为它甚至是通过接口实现的,所以它应该是“微创”的。他们比我在这里描述得更好。

于 2010-10-19T23:42:42.283 回答