http://en.wikipedia.org/wiki/Command_pattern
Командные объекты являются полезными для реализации:
Многоуровневая отменить Если все действия пользователя в программе реализованы как командные объекты, программа может держать стек с Самые последние выполненные команды. Когда пользователь хочет отменить команду, программа просто вытаскивает последний командный объект и выполняет его метод отмены() .
Edit: Чтобы поместить в перспективе, как это может быть полезно, если бы я собирался решить эту проблему, что я хотел бы сделать это запись каждого «действие» пользователь делает, как рисовать линии и т.д., как команды и хранить все связанная информация о завершении этого действия внутри этой команды, прежде чем применять ее к контексту рисования.
Таким образом, каждое действие помещается в стек, поэтому вы можете отбрасывать предметы.
Чтобы облегчить скорость, я также, вероятно, посмотрю на что-то вроде записи состояния объекта чертежа для серии действий. Поскольку это контекст рисования, вероятно, было бы легче начать с известного состояния чертежа и повторно использовать команды для создания текущей версии.
Так, например, у меня был бы запущенный стек команд и работающий стек объектов рисования. Каждые 5 команд я бы нажимал состояние объекта чертежа на его стек, поэтому, когда пользователь будет отменять отмену, я бы захватил верхнее состояние объекта рисования и применил новейшие команды к сохранению объекта для последнего. Чтобы отменить 10 действий, я вернусь к двум состояниям объектов рисования и не буду применять к ним какие-либо новые команды.
Скорее всего, вы захотите ограничить глубину состояний отмены/повтора, которые вы можете сделать в своей программе, иначе она будет бесконечно расти в памяти.
Как бы вы определили «последний» краска? Скажем, я рисую линию, перетаскивая кисть. Это «одна» краска или много? Если вы ищете .NET-класс, который сделает это за вас, вам может быть не повезло. – 2010-05-27 18:12:01
Это будет одна краска. Я действительно не ищу класс. – Tanner