2010-12-13 25 views
8

En mi aplicación, deseo proporcionar al usuario una pequeña funcionalidad de deshacer. No hay muchas acciones que el usuario pueda deshacer. En particular, las acciones son:¿Cómo implementar la funcionalidad de deshacer?

  • añadir notas a un objeto
  • color de un objeto
  • Tag una objcet con una cadena

Ahora pensé acerca de cómo implementar esto. Primero pensé en una clase de acción que es la clase base abstracta para las 3 acciones diferentes que puede tomar el usuario. Cada vez que el usuario asume estas acciones, se crea una nueva instancia apropiada de una subclase de esta clase de Acción abstracta y se inserta en una lista que contiene todas las acciones.

Cuando el usuario desea deshacer algo, la lista se muestra al usuario y puede elegir qué acción desea deshacer.

Ahora estaba pensando lo que tiene que ser almacenado en un objeto tal acción:

  • el estado del objeto antes de la acción
  • la acción real que fue tomada (por ejemplo, la cadena que se añadió a las notas de un objeto)

No estoy seguro si esto es suficiente. También pensé en algo así como un orden cronológico, pero esto debería ser necesario ya que la lista puede mantenerse cronológicamente correcta.

¿Hay alguna otra cosa que deba considerar?

+1

Busque el patrón de recuerdo en GOF – pastjean

+2

O patrón de comando – slayerIQ

+1

Vea también aquí: http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine –

Respuesta

14

Deshacer/rehacer es comúnmente i implementado con el Command Pattern. La clase Action se puede usar como base para esto, pero se necesita una acción 'do' y una acción 'deshacer' dentro de cada comando. Here is an example de esto en la práctica. Probablemente debería almacenar los comandos ejecutados en una pila, ya que hace que sea mucho más fácil de implementar y mucho más fácil de seguir para el usuario.

2

Todo parece correcto, pero prefiero usar la pila que la lista. Será útil en el aspecto de ordenamiento cronológico.

2

Para implememtation correcta y probada para deshacer la funcionalidad es el patrón Comando

9

Usted podría hacer algo tan simple como esto:

Stack<Action> undoStack = new Stack<Action>();  

void ChangeColor(Color color) 
{ 
    var original = this.Object.Color; 
    undoStack.Push(() => this.Object.Color = original); 
    this.Object.Color = color; 
} 
+0

Me gusta este. Nunca había pensado en almacenar acciones reales ... muy bien. – Crisfole

Cuestiones relacionadas