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.?

Foi útil?

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:

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

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

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',))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top