我正在为使用C#开发的软件片段实现撤消/重做功能。发生撤消/重做操作的数据存储为对象列表List<MyClass>
。在某些情况下,列表的大小可能会变大(> 1k)。
我希望用户尽可能多地撤消/重做。但如果我只是存储所有以前的状态(如在Memento模式中),可能会导致软件耗尽太多内存,这是我不想要的。
我提出的解决方案列表是:
UNDO: DEL LIST[5]
&amp; REDO: INSERT <object> LIST[5]
有哪些其他有效的方法可以实现撤消/重做功能,以及它们如何与上述解决方案进行比较?
答案 0 :(得分:0)
我的首选方法是对应用程序的不同部分使用不同的堆栈,并将它们聚合在一起。我觉得这非常有效。我发布了一个实现这种方法的开源项目 - https://www.nuget.org/packages/UndoService/
我已将此方法与您的第一个建议结合使用。当我的应用程序中的背景图像更改时,它只存储 Id,并根据需要从磁盘加载它。其他对象使用较少的内存,因此它们的整个状态只是存储在 RAM 中的堆栈中。撤消服务使用委托来访问状态和通用堆栈,因此混合使用这样的方法非常简单。
我之前使用过一种基于与您的第二个建议相同的概念的通用方法。这是将命令模式与命令接口中定义的 Undo() 方法一起使用。就执行期间的资源而言,这是一种非常有效的方法,因为它根本不需要存储状态,只需要存储命令。但是,我放弃了它而支持 Memento,因为它涉及额外的开发时间和复杂性。也就是说,它非常适合某些项目,尤其是在命令数量不是太多或应用程序状态的内存印记很重要的情况下。