estrutura de dados usadas para implementar opção desfazer e refazer
-
22-08-2019 - |
Pergunta
Eu quero implementar opção desfazer e refazer (como vemos em MS palavra etc). Você pode me sugerir uma estrutura de dados para ele, e como posso implementá-lo.?
Solução
Não é uma estrutura de dados, mas um padrão de design. Você está procurando o Comando Padrão .
O padrão é manter os objetos de comando em uma pilha de apoio multi desfazer nível. A fim de refazer apoio, uma segunda pilha mantém todos os comandos que você desfez. Então, quando você pop a pilha de desfazer para desfazer um comando, você empurra o mesmo comando que você pisou na pilha de repetição. Você fazer a mesma coisa no sentido inverso quando você refazer um comando. Você pop a pilha de repetição e empurre a parte de trás de comando pisou na pilha de desfazer.
Outras dicas
Na verdade, o padrão normal para esta funcionalidade (Gang of Four, mesmo) é Memento .
Além disso, enquanto a maioria dos programas usam pilhas de desfazer / refazer, aficionados de certos editores de texto preferem desfazer / refazer árvores , para que eles não percam toda a sua história se desfazer alguns comandos, tente um novo, e mudar as suas mentes.
Objective-C Cacau tem uma anwser bem documentado chamado NSUndoManager .
Você pode usar o padrão de comando para achive Undo / Redo
Verifique estas amostras:
Este é um caso clássico de padrão de comando. A seguir é um exemplo de implementação de recurso de desfazer em 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',))