структура данных, используемая для реализации опции UNDO и REDO - PullRequest
45 голосов
/ 31 марта 2009

Я хочу реализовать опции UNDO и REDO (как мы видим в MS word и т. Д.). Можете ли вы предложить мне структуру данных для него, и как я могу это реализовать .?

Ответы [ 5 ]

100 голосов
/ 31 марта 2009

Это не структура данных, а шаблон проектирования. Вы ищете Шаблон команды .

Стандарт - хранить объекты Command в стеке для поддержки многоуровневой отмены. Для поддержки повтора второй стек хранит все команды, которые вы отменили. Поэтому, когда вы извлекаете стек отмены, чтобы отменить команду, вы нажимаете ту же команду, которую вы вставили в стек повторного выполнения. Вы делаете то же самое в обратном порядке, когда вы повторяете команду. Вы вставляете стек повторного выполнения и помещаете всплывающую команду обратно в стек отмены.

35 голосов
/ 26 мая 2009

На самом деле стандартный шаблон для этой функциональности (даже «Банда четырех»): Memento .

Кроме того, в то время как большинство программ используют стеки отмены / повтора, любители некоторых текстовых редакторов предпочитают отменять / возвращать деревья , чтобы они не потеряли всю свою историю, если отменить несколько команд, попробуйте новую один и передумать.

2 голосов
/ 04 мая 2017

Это классический случай Command Pattern. Ниже приведен пример реализации функции отмены в 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',))
2 голосов
/ 31 марта 2009

Вы можете использовать шаблон команд для достижения отмены / повтора

Проверьте эти образцы:

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

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

2 голосов
/ 31 марта 2009

Objective-C Какао имеет хорошо документированный ответ по имени NSUndoManager .

...