pattern patron observer estados ejemplos diseño data-structures design-patterns undo-redo

data structures - patron - estructura de datos utilizada para implementar la opción UNDO y REDO



patron de estados java (5)

En realidad, el patrón estándar para esta funcionalidad (Gang of Four, even) es Memento .

Además, aunque la mayoría de los programas usan pilas Deshacer / Rehacer, los aficionados de ciertos editores de texto prefieren Deshacer / Rehacer árboles para que no pierdan todo su historial si deshacen algunos comandos, prueban uno nuevo y cambian de opinión.

Quiero implementar la opción UNDO y REDO (como vemos en MS Word, etc.). ¿Puede sugerirme una estructura de datos para él y cómo puedo implementarlo?


Este es un caso clásico de Command Pattern. A continuación se muestra una implementación de muestra de la función Deshacer en 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'',))


No es una estructura de datos sino un patrón de diseño. Está buscando el patrón de comando .

El estándar es mantener los objetos Command en una pila para admitir deshacer de varios niveles. Con el fin de admitir rehacer, una segunda pila mantiene todos los comandos que has Deshace. Así que cuando abre la pila de deshacer para deshacer un comando, empuja el mismo comando que apareció en la pila de rehacer. Usted hace lo mismo al revés cuando rehace un comando. Se abre la pila de rehacer y se vuelve a insertar el comando en la pila de deshacer.


Objective-C Cocoa tiene un guion bien documentado llamado NSUndoManager .