2009-01-12 13 views
8

que estoy tratando de implementar una función de deshacer/rehacer en mi aplicación, utilizando el Command Pattern. Estoy enfrentando un problemadeshacer/rehacer con eliminaciones en cascada

Para ilustrarlo, imaginemos que puede crear con mis perfiles de aplicaciones 2D (tantos como desee).

A partir de estos perfiles 2D, a continuación, puede crear una pieza 3D con diferentes atributos (nombre, color, escala, etc.).

+--------------+    +--------------+  +--------------+ 
| 2D profile A |    | 2D profile B |  | 2D profile C | 
+--------------+    +--------------+  +--------------+ 
    | |       | 
    | +---------------+  +---------------+ 
    | | 3D Part B  |  | 3D Part C  | 
    | | Colour : blue |  | Colour : grey | 
    | | Name : bibi |  | Name : foo | 
    | | Scale : 33% |  | Scale : 100% | 
    | +---------------+  +---------------+ 
+--------------+ 
| 3D Part A | 
| Colour : red | 
| Name : aaa | 
| Scale : 50% | 
+--------------* 

Cuando se elimina un perfil, todas las piezas en 3D, que incorpora un en este perfil son de forma automática eliminan también (cuando un perfil está a punto de ser eliminado, un gerente de piezas en 3D es notificado y eliminará las piezas 3D obsoletos. Las vistas también son notificadas para actualizar la GUI).

Aquí es donde estoy frente a un problema: estoy escribiendo de deshacer/rehacer comandos para borrar un perfil 2D, que se ve algo como esto (pseudo-código):

virtual void redo() 
{ 
    m_pProfileList.remove(m_pProfile); // This will automatically delete all 3D parts relying on the deleted 2D profile 
} 

virtual void undo() 
{ 
    m_pProfileList.add(m_pProfile); // This will add the 2D profile, but the 3D Parts are lost 
} 

Como se puede ver en el código anterior, la eliminación del perfil 2D eliminará automáticamente todas las partes 3D dependiendo del perfil eliminado.

Pero cuando se hace deshacer, volver a agregar el perfil 2D a la lista no es suficiente: las piezas 3D se pierden.

¿Qué debo hacer? ¿Debería el comando deshacer/rehacer ser responsable de encargarse de la eliminación de las partes 3D (que en realidad es algo realizado por el administrador de partes 3d)? Esto significaría que el comando deshacer/rehacer también sería responsable de notificar a las vistas para actualizar la GUI.

O debería de deshacer/rehacer comandos crear una copia interna de todas las piezas en 3D que se borrarán y dejar que el gestor de parte 3d borrar las piezas 3D?

¿O hay otra solución mejor?

Gracias por su ayuda!

Respuesta

1

¿Quieres una ligera variación en esto: la Memento pattern. Almacena instantáneas de su árbol de objetos completo o simplemente todas las diferencias en cada cambio. Armado con esta historia sucesiva de cambios, puede ir hacia adelante y hacia atrás a través de comandos al contenido de su corazón, sin perder objetos dependientes.

Cuestiones relacionadas