2009-01-12 6 views
8

Ich versuche, eine Funktion zum Rückgängigmachen/Wiederherstellen in meine Anwendung zu implementieren, mit der Command Pattern. Ich stehe vor einem Problem.Undo/Redo mit kaskadierenden Löschungen

Um es zu veranschaulichen, lassen Sie uns vorstellen, dass Sie mit meiner Anwendung 2D-Profile erstellen können (so viele wie Sie möchten).

Aus diesen 2D-Profilen können Sie dann ein 3D-Teil mit verschiedenen Attributen (Name, Farbe, Maßstab usw.) erstellen.

+--------------+    +--------------+  +--------------+ 
| 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% | 
+--------------* 

Wenn ein Profil gelöscht wird, werden alle 3D-Teile, die ein auf diesem Profil gebaut sind zu automatisch gelöscht (wenn ein Profil über gelöscht werden soll, ein 3D-Teil-Manager benachrichtigt wird und die veralteten 3D-Teile löschen. Ansichten werden auch benachrichtigt, um die GUI zu aktualisieren).

Dies ist, wo ich ein Problem bin vor: Ich habe die Undo ich schreibe/Befehl Redo für ein 2D-Profil zu löschen, die so etwas wie dieses (Pseudo-Code) sieht:

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 
} 

Wie können Sie Wenn Sie im obigen Code sehen, werden beim Entfernen des 2D-Profils automatisch alle 3D-Teile gelöscht, die auf dem entfernten Profil basieren.

Aber wenn Sie Rückgängig machen, ist das erneute Hinzufügen des 2D-Profils zur Liste nicht genug: die 3D-Teile sind verloren.

Was soll ich tun? Sollte der Undo/Redo-Befehl dafür verantwortlich sein, das Löschen der 3D-Teile zu übernehmen (was wird eigentlich vom 3D-Part-Manager gemacht)? Dies würde bedeuten, dass der Undo/Redo-Befehl auch dafür verantwortlich wäre, die Ansichten zu benachrichtigen, um die GUI zu aktualisieren.

Oder sollte der Undo/Redo-Befehl eine interne Kopie aller 3D-Teile erstellen, die gelöscht werden und der 3D-Teile-Manager die 3D-Teile löschen lassen?

Oder gibt es eine andere bessere Lösung?

Danke für Ihre Hilfe!

Antwort

1

Sie möchten eine leichte Variation: Memento pattern. Sie speichern Snapshots Ihrer vollständigen Objektstruktur oder nur alle Unterschiede bei jeder Änderung. Bewaffnet mit dieser sukzessiven Geschichte der Veränderungen können Sie dann durch Befehle nach Herzenslust rückwärts und vorwärts gehen, ohne abhängige Objekte zu verlieren.