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

11

你好,我即将为我目前正在编写的应用程序添加新功能。我需要编写撤消/重做功能。然而,我们应用程序已完成了90%,我不知道在不影响已经创建的代码的情况下实现此功能的最佳方法。


我们需要看到一些代码,或者您需要描述一下您的程序,这样我们才能提供帮助。 - Andrew M
2
考虑到您甚至没有告诉我们这是什么类型的应用程序(Web、Silverlight、桌面等)或者它属于哪个类别(游戏、CRUD、社交网络等),实际上我们无从下手。 - tster
这是一个 WPF 应用程序,允许用户绘制图表。用户可以添加不同的块类型、连接它们、移动和调整大小。他还可以为块分配某些属性 - 名称、日期等。 - pieere
3个回答

8

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(); }        
        }       
    }   
}

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

链接文本


8

这里提供的信息不是很详细。然而,撤销/重做功能通常通过某种变体的命令模式来处理。根据您的架构,这可能只需要将基本功能重新构建为“命令”,或进行彻底的大改动。


1
这就是做法。一旦您的程序所做的所有事情都通过"命令"实例进行处理,那么您已经完成了80%的工作。 - Detmar
3
如果最初的建筑师/开发人员在设计系统时没有考虑到这一点,我倾向于认为这将是一次重大的全面改革! - tster
通常情况下,这是一个相当大的重构工作 - 尽管这取决于应用程序最初的架构设计有多好。 - Reed Copsey

-1

CSLA.NET 是一个包含内置撤销/重做功能的业务逻辑库。我认为它甚至是通过接口实现的,因此应该是“最小侵入性”的。他们比我更好地描述了它 这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接