Подтвердить что ты не робот

Структура данных, используемая для реализации варианта UNDO и REDO

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

4b9b3361

Ответ 1

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

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

Ответ 2

На самом деле стандартный шаблон для этой функции (Gang of Four, even) Memento.

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

Ответ 3

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

Ответ 5

Это классический случай 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',))