Data structures 用于实现撤消和重做选项的数据结构

Data structures 用于实现撤消和重做选项的数据结构,data-structures,design-patterns,undo-redo,Data Structures,Design Patterns,Undo Redo,我想实现撤销和重做选项(正如我们在MS word等中看到的)。你能为我推荐一个数据结构吗?我该如何实现它?它不是一个数据结构,而是一个设计模式。你在找那个 标准是将命令对象保留在堆栈中,以支持多级撤消。为了支持重做,第二个堆栈保留所有已撤消的命令。因此,当您弹出撤消堆栈以撤消命令时,您将弹出的同一命令推入重做堆栈。当你重做一个命令时,你做同样的事情。弹出重做堆栈并将弹出的命令推回到撤消堆栈中。Objective-C Cocoa有一个名为的文档化的anwser。您可以使用命令模式实现撤消/重做 检

我想实现撤销和重做选项(正如我们在MS word等中看到的)。你能为我推荐一个数据结构吗?我该如何实现它?

它不是一个数据结构,而是一个设计模式。你在找那个


标准是将命令对象保留在堆栈中,以支持多级撤消。为了支持重做,第二个堆栈保留所有已撤消的命令。因此,当您弹出撤消堆栈以撤消命令时,您将弹出的同一命令推入重做堆栈。当你重做一个命令时,你做同样的事情。弹出重做堆栈并将弹出的命令推回到撤消堆栈中。

Objective-C Cocoa有一个名为的文档化的anwser。

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

检查这些样本:


实际上,此功能的标准模式(四人组,甚至)是


此外,虽然大多数程序使用撤销/重做堆栈,但某些文本编辑器的Afficionado更喜欢撤销/重做树,这样,如果他们撤销一些命令,尝试一个新命令,并改变主意,就不会丢失整个历史。

这是命令模式的一个经典案例。以下是Python中撤销功能的示例实现:

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',))

另外,如果你按下另一个命令,总是清除重做堆栈也很重要。我觉得命令模式不一定是你实现撤销的方式,它只是一个选项,也不是OP问题的答案。撤销/重做堆栈就是答案。(虽然我想他确实提到了MSWord。)你是对的。如果您添加有关它如何与命令模式交互的更多信息,这将是一个很好的答案。请尝试清除Memento的用法,Memento是否用于存储撤消/重做操作前后的对象状态?生成Memento的对象使用它将自身返回到该状态。纪念品本身应该被视为不透明的。将整个状态填充到Memento中似乎是一个显而易见的实现选择,但它也可以是一个diff,或者是一个id,或者是一个备份存储,或者其他什么。