Шаблон команды для отмены / повтора в приложении рисования

Я хотел бы реализовать отмену / повтор в небольшомнанесение краски, КажетсяШаблон команды хорошо подходит для использования, но я не уверен, как лучше всего это реализовать.

Как я понимаю шаблон, необходимо включить в каждую команду:

The details of the paint operation for purposes of redo (e.g. Line -> start & end points, free form line -> GeneralPath) The state of the component prior to the change for undo. In this case, that will be a small snapshot image of the area affected by the command.

На основании этого я понимаю, что каждая команда должна быть «атомарной»; или самодостаточный, со всей информацией, необходимой для отмены / повторения этой операции.

К сожалению, для этого потребуется хранить больше информации, чем я ожидал. Для линии мы должны также учитывать такие вещи, какColor, Stroke а такжеRenderingHints рисовал изначально. Это превращает мои «простые маленькие команды» во что-то ... более громоздкое в памяти, и с большим количеством кода котельной пластины для производства (каждый будет сериализуемым компонентом1).

Из соображений сохранения памяти (в основном) я хотел «обмануть»; на спецификации команд. Возможно, при каждом 100-м обновлении делайте резервную копию всей области рисования, но в противном случае не сохраняйте часть измененного изображения и просто перестраивайте последние (до) 100 команд для каждой новой операции рисования. Но это кажется проблематичным, чтобы гарантировать, что состояниеGraphics Объект находится прямо перед окраской каждой части - эта часть может потребовать линии, ноRenderingHints были изменены 4 команды назад,Color было изменено 98 команд назад, в то время какStroke остался прежним для последних 227 команд.

Погоня за более эффективной памятью командой, кажется, выбрасывает шаблон прямо из окна в терминах «атомарного». Это, в свою очередь, приводит к трудностям при определении самой ранней команды, которая может повлиять на рендеринг.

Нужно ли мне:

Look for a new pattern? Attempt to implement my peculiar needs by tweaking the pattern? Toss all this in the waste bin as premature optimization and code it in the simplest (and most memory consuming) way that sticks to the command pattern as defined? Update "each will be a serializable bean" On 2nd thoughts, no. I did dome checks to find that a Graphics2D (which neatly encapsulates many parameters used when drawing) is not serializable. Further, a BasicStroke is serializable, but the thickness of the stroke is not stored. I could create serializable versions of many of the attributes but it seems to make for a lot more code, so I'm going to abandon that spec. as well. I will only attempt to store a reference to a BufferedImage at run-time.

Ответы на вопрос(2)

Ваш ответ на вопрос