Wzór polecenia dla cofania / ponawiania w aplikacji farby

Chciałbym zaimplementować cofanie / ponawianie w małymaplikacja farby. Wydaje sięWzór polecenia pasuje do użytkowania, ale nie wiem, jak go najlepiej wdrożyć.

Jak rozumiem wzór, w każdym poleceniu należy uwzględnić:

Szczegóły operacji malowania dla celów ponownego wykonania (np. Linia -> punkty początkowe i końcowe, linia swobodna ->GeneralPath)Stan komponentu przed zmianą cofnięcia. W tym przypadku będzie to mały obraz migawki obszaru, którego dotyczy polecenie.

Na podstawie tego rozumiem, że każde polecenie musi być „atomowe” lub samoistne, z wszystkimi informacjami potrzebnymi do cofnięcia / ponownego wykonania tej operacji.

Niestety wymagałoby to przechowywania większej ilości informacji, niż początkowo oczekiwałem. Dla linii musimy również uwzględnić rzeczy takie jakColor, Stroke iRenderingHints używane do rysowania początkowo. To zamienia moje „proste małe rozkazy” w coś .. bardziej masywnego w pamięci i z większym kodem płyty kotłowej do wyrzucenia (każdy będzie fasolą możliwą do serializacji)1).

Ze względu na ochronę pamięci (głównie) chciałem „oszukać” specyfikację poleceń. Może wykonać kopię zapasową całego obszaru rysowania co 100 aktualizacji, ale poza tym nie przechowywać żadnej części zmienionego obrazu i po prostu odbudować ostatnie (do 100) poleceń dla każdej nowej operacji malowania. Ale wydaje się to problematyczne, aby zapewnić, że stanGraphics obiekt jest tuż przed malowaniem każdej części - ta część może wymagać linii, aleRenderingHints zostały zmienione 4 komendy temuColor został zmieniony 98 poleceń temu, podczas gdyStroke pozostało takie samo dla ostatnich 227 poleceń.

Wydanie polecenia bardziej wydajnego pod względem pamięci zdaje się rzucać wzór prosto w okno w kategoriach bycia „atomowym”. To z kolei prowadzi do trudności w określeniu najwcześniejszego polecenia, które może wpłynąć na renderowanie.

Czy powinienem:

Poszukaj nowego wzoru?Spróbuj wdrożyć moje szczególne potrzeby, ulepszając wzór?Wrzuć to wszystko do kosza na śmieci jako przedwczesną optymalizację i zakoduj je w najprostszy (i najbardziej zużywający pamięć) sposób, który trzyma się schematu poleceń zgodnie z definicją?Aktualizacja„każdy będzie fasolą możliwą do serializacji” Na 2 myśli, nie. Sprawdziłem kopułę, aby znaleźćGraphics2D (który ładnie hermetyzuje wiele parametrów używanych podczas rysowania) nie można serializować. Dalej, aBasicStroke jest serializowalny, ale grubość obrysu nie jest zapisywana. Mogłem tworzyć wersje wielu atrybutów, które można poddać serializacji, ale wydaje się, że tworzy to znacznie więcej kodu, więc zrezygnuję z tej specyfikacji. także. Spróbuję tylko zapisać odniesienie do aBufferedImage W czasie wykonywania.

questionAnswers(2)

yourAnswerToTheQuestion