2010-12-13 26 views
8

In meiner Anwendung möchte ich dem Benutzer eine kleine Rückgängig-Funktion zur Verfügung stellen. Es gibt nicht viele Aktionen, die vom Benutzer rückgängig gemacht werden können. Insbesondere sind die Aktionen:Wie implementiert man Funktionalität rückgängig machen?

  • Notizen hinzufügen zu einem Objekt
  • Farbe ein Objekt
  • Tag ein objcet mit einem String

Nun dachte ich über, wie diese umzusetzen. Ich dachte zuerst an eine Aktionsklasse, die die abstrakte Basisklasse für die 3 verschiedenen Aktionen ist, die vom Benutzer ausgeführt werden können. Jedes Mal, wenn der Benutzer diese Aktionen übernimmt, wird eine neue geeignete Instanz einer Unterklasse dieser abstrakten Aktionsklasse erstellt und in eine Liste eingefügt, die alle Aktionen enthält.

Wenn der Benutzer etwas rückgängig machen möchte, wird die Liste dem Benutzer angezeigt und er kann auswählen, welche Aktion er rückgängig machen möchte.

Jetzt dachte ich, was in einem solchen Aktionsobjekt gespeichert werden muss:

  • der Zustand des Objekts vor der Aktion
  • die eigentliche Aktion, die (zum Beispiel die Zeichenfolge genommen wurde, die hinzugefügt wurde die notizen eines objekts)

Ich bin mir nicht sicher, ob das genug ist. Ich dachte auch über eine chronologische Reihenfolge nach, aber das sollte notwendig sein, da die Liste chronologisch korrekt sein kann.

Gibt es noch andere Dinge, die ich beachten sollte?

+1

Suche nach dem Memento-Muster in GOF – pastjean

+2

Oder Befehlsmuster – slayerIQ

+1

Siehe auch hier: http://StackOverflow.com/Questions/49755/design-Pattern-for-undo-Engine –

Antwort

14

Undo/Redo ist häufig ich mit dem Command Pattern. Die Action Klasse kann als Grundlage dafür verwendet werden, aber Sie benötigen eine Aktion 'Ausführen' und eine Aktion 'Rückgängig' innerhalb jedes Befehls. Here is an example davon in der Praxis. Sie sollten die Befehle, die in einem Stapel ausgeführt werden, wahrscheinlich speichern, da dies die Implementierung viel einfacher macht und dem Benutzer viel leichter zu folgen ist.

2

Alles scheint richtig, aber ich würde lieber Stack als Liste verwenden. Es wird im chronologischen Bestellaspekt nützlich sein.

2

für die korrekte und bewährte implememtation für UNDO Funktionalität ist Command-Muster

9

Sie einfach etwas tun könnte wie folgt:

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

Ich mag dieses. Hätte nie gedacht, tatsächliche Aktionen zu speichern ... sehr nett. – Crisfole

Verwandte Themen