Befehlsmuster zum Rückgängigmachen / Wiederherstellen in der Farbanwendung

Ich möchte Undo / Redo in einem kleinen implementierenFarbauftrag. Es scheint dieBefehlsmuster passt gut zum einsatz, aber ich bin mir nicht sicher, wie ich es am besten umsetzen soll.

Wie ich das Muster verstehe, ist es notwendig, in jeden Befehl Folgendes aufzunehmen:

Die Details des Malvorgangs zum Wiederholen (z. B. Linie -> Start- und Endpunkte, Freiformlinie ->GeneralPath)Der Status der Komponente vor der Änderung zum Rückgängigmachen. In diesem Fall handelt es sich um eine kleine Momentaufnahme des vom Befehl betroffenen Bereichs.

Mein Verständnis basiert darauf, dass jeder Befehl "atomar" oder in sich geschlossen sein muss, mit allen Informationen, die für das Rückgängigmachen / Wiederherstellen dieser Operation benötigt werden.

Leider würde das das Speichern von mehr Informationen erfordern, als ich zuerst erwartet hatte. Für eine Linie müssen wir auch Dinge wie die berücksichtigenColor, Stroke undRenderingHints verwendet, um es anfangs zu zeichnen. Dies verwandelt meine 'einfachen kleinen Befehle' in etwas, das sperriger im Speicher ist und mehr Code für die Kesselplatte enthält (jeder wird eine serialisierbare Bohne sein)1).

Aus Gründen der Speichererhaltung wollte ich (meistens) die Spezifikation der Befehle "betrügen". Erstellen Sie möglicherweise bei jeder 100. Aktualisierung eine Sicherungskopie des gesamten Zeichenbereichs, aber speichern Sie andernfalls keinen Teil des geänderten Abbilds, und erstellen Sie einfach die letzten (bis zu) 100 Befehle für jede neue Maloperation neu. Das scheint aber problematisch zu sein, um den Stand der Technik zu gewährleistenGraphics Objekt ist direkt vor dem Malen jedes Teils - dieser Teil erfordert möglicherweise eine Linie, aber dieRenderingHints Vor 4 Kommandos wurden die geändertColor wurde vor 98 Kommandos geändert, während dieStroke ist bei den letzten 227 Befehlen gleich geblieben.

Die Verfolgung eines speichereffizienten Befehls scheint das Muster als "atomar" aus dem Fenster zu werfen. Dies führt wiederum zu Schwierigkeiten bei der Bestimmung des frühesten Befehls, der sich auf das Rendering auswirken könnte.

Sollte ich:

Suchen Sie nach einem neuen Muster?Versuchen Sie, meine besonderen Bedürfnisse zu implementieren, indem Sie das Muster optimieren?Werfen Sie all dies als vorzeitige Optimierung in den Papierkorb und codieren Sie es auf die einfachste (und speicherintensivste) Weise, die sich an das festgelegte Befehlsmuster hält.Aktualisieren"Jeder wird eine serialisierbare Bohne sein" Am 2. Gedanken, nein. Ich habe Kuppelprüfungen durchgeführt, um festzustellen, dass aGraphics2D (der viele beim Zeichnen verwendete Parameter übersichtlich kapselt) ist nicht serialisierbar. Weiter aBasicStroke ist serialisierbar, aber die Strichstärke wird nicht gespeichert. Ich könnte serialisierbare Versionen von vielen Attributen erstellen, aber es scheint viel mehr Code zu geben, also werde ich diese Spezifikation aufgeben. auch. Ich werde nur versuchen, einen Verweis auf a zu speichernBufferedImage zur Laufzeit.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage