2016-12-13 1 views
0

Alle Beispiele und Tutorials, die ich bisher online gefunden habe, behandeln Befehle, die einen Wert addieren oder subtrahieren oder eine andere Operation ausführen - Calculator ist das gängige Beispiel.Befehlsentwurfsmuster für nicht verwandte Befehle

Wie auch immer, wenn Sie Befehle haben, die sich nicht wie in einem Taschenrechner verhalten?

Stellen Sie sich ein Zeichenprogramm wie Microsoft Visio vor, in dem Benutzer Objekte auf dem Bildschirm an eine x- und y-Position platzieren und verschieben. Oder ein Objekt hinzufügen und entfernen. Diese Befehle sind nicht miteinander verknüpft, so dass die Verfolgung einer aktuellen x, y-Position keine Bedeutung hat, wenn der nächste Befehl im Stapel ein Befehl zum Erstellen eines Objekts ist, den Sie rückgängig machen müssen.

Irgendwelche Vorschläge, wie man damit umgeht?

+0

Das Befehlsmuster ist nicht _really_, um ein "Rückgängigmachen" zu ermöglichen. Im Kern bietet es eine Möglichkeit, die Implementierung von der Operation zu entkoppeln, die Sie gerade ausführen, z. B. wenn Sie eine Schaltfläche haben, die das Objekt mit dem Befehlsmuster in die Mitte des Bildschirms bewegt, ruft die Schaltfläche lediglich etwas wie 'auf moveToMiddle (obj) '- es muss nicht wissen, dass die" echte "Implementierung 'obj.setX (width/2) ist; obj.setY (height/2) ', wie sich diese Implementierung ändern kann. Wenn Sie rückgängig machen wollen, schauen Sie sich an, was Redux macht - jeder Befehl wird eine Modifikation sein, und Sie können sie rückgängig machen, indem Sie die Umkehrung anwenden. – vlaz

+1

Das beruht jedoch darauf, einen konsistenten Zustand zu halten. Für eine "entspanntere" Lösung können Sie Command und Memento kombinieren, um eine Momentaufnahme des Geschehens zu erstellen. Auf diese Weise wird beim Zurücksetzen eines Befehls der Snapshot wiederhergestellt. – vlaz

Antwort

0

Angenommen, "Objekt auf Achse verschieben" + richtiger Befehl ist ein "Objekt". Dann befehligen Befehlsmuster dieses Objekt und enthalten den Befehl. Daher beinhaltet das Befehlsmuster keinen "Erhalt des Zustands dieses Objekts". Jedesmal ist es egal, ob das Eingabeobjekt gleich oder verschieden ist.

Im Fall des Rechners ist "delete command" dasselbe wie "remove object command".

Vor dieser Diskussion, was ist Ihr Zweck, Befehlsmuster für bewegte Objekte zu verwenden?

+0

Ich verwende momentan kein Befehlsmuster. Ich habe darüber nachgedacht, wie ich meiner Anwendung eine Funktion zum Rückgängigmachen/Wiederherstellen hinzufügen kann. Ich fand diese ähnliche Frage hier http://stackoverflow.com/questions/3250104/fast-und-redo-with-memento-command-pattern – sjs