用于实施UNDO和REDO选项的数据结构

我想实施UNDO和REDO选项(就像我们在MS word中看到的那样)。 你能build议我一个数据结构吗,我该如何实现呢?

这不是一个数据结构,而是一个devise模式。 你正在寻找命令模式 。

标准是将Command对象保存在一个堆栈中以支持多级撤销。 为了支持重做,第二个堆栈保存所有你没有使用的命令。 所以当你popup撤消堆栈来撤消一个命令时,你可以将你popup的命令推入重做堆栈。 当你重做一个命令的时候,你可以做同样的事情。 您popup重做堆栈并将popup的命令推回到撤消堆栈中。

其实,这个function的标准模式(四人帮,甚至)是纪念品 。

此外,尽pipe大多数程序使用撤销/重做堆栈,但某些文本编辑人员更喜欢撤销/重做树,以便在撤消一些命令,尝试新命令并改变主意时,不会丢失整个历史logging。

Objective-C Cocoa有一个名为NSUndoManager的良好文档。

您可以使用命令模式来实现撤消/重做

检查这些样品:

http://www.codeproject.com/csharp/undoredobuffer.asp

http://www.dofactory.com/Patterns/PatternCommand.aspx

这是命令模式的经典案例。 以下是Python中撤消function的示例实现:

from os import rename class RenameFileCommand(object): def __init__(self, src_file, target_file): self.src_file=src_file self.target_file=target_file def execute(self): rename(self.src_file, self.target_file) def undo(self): rename(self.target_file,self.src_file) class History(object): def __init__(self): self.commands=list() def execute(self, command): command.execute() self.commands.append(command) def undo(self): self.commands.pop().undo() if __name__=='__main__': hist=History() hist.execute(RenameFileCommand( 'test1.txt', 'tmp.txt', )) hist.undo() hist.execute(RenameFileCommand( 'tmp2.txt', 'test2.txt',))