Я дам еще один ответ, но я думаю, что охват пока недостаточен.
Сюжет далеко не тривиален, и поиск в Google возвращает множество результатов. Во многих приложениях реализована операция отмены, и существует множество вариантов.
Здесь есть 2 модели дизайна, которые могут помочь нам:
Command
: это ограничение действия
Memento
: состоит в сохранении состояния (обычно подразумевает некоторую форму сериализации)
Шаблон Command
интенсивно используется в графических средах, потому что обычно есть различные способы выполнить действие. Представьте себе сохранить в Microsoft Word, например:
- Вы можете нажать на сохранить значок
- Вы можете зайти в меню Файл и нажать Сохранить
- вы используете ярлык, обычно CTRL + S
И, конечно, save , вероятно, реализован в терминах save as .
Преимущество шаблона Command
здесь двоякое:
- вы можете создать стек объектов
- вы можете попросить каждый объект реализовать
undo
операцию
Теперь существуют различные проблемы, которые относятся к undo
:
- некоторые операции не могут быть отменены (например, рассмотрим
rm
в Linux или пустое мусорное ведро действие в Windows)
- некоторые операции трудно отменить, или они могут не быть естественными (вам нужно сохранить какое-то состояние, объект обычно уничтожается, но здесь вам нужно будет фактически сохранить его в команде для действия отмены)
- обычно мы рассматриваем отмену / повтор как стек, некоторые программы (в основном, графические) предлагают отменить элементы без фактического удаления того, что было сделано впоследствии, этого гораздо труднее достичь, особенно когда новые действия были построены на вершина отмены ...
Поскольку существуют различные проблемы, существуют различные стратегии:
- Для простой команды вы можете рассмотреть возможность отмены (например, добавление символа можно отменить, удалив его)
- Для более сложной Команды вы можете рассмотреть возможность отмены восстановления как восстановления предыдущего состояния (вот где
Memento
срабатывает)
- Если у вас много сложных команд, что может означать много
Memento
с, которые занимают место, вы можете использовать подход, который заключается в запоминании только одной Снимок каждые 10 или 20 команд, и затем повторяет команды с последнего снимка до отмененной команды
На самом деле, вы, вероятно, можете смешивать Command
и Memento
на досуге, в зависимости от особенностей вашей системы и, следовательно, от сложности любого из них.
Я бы только рассмотрел возможность отмены последнего выполненного действия, для начала (с использованием стека действий). Функциональность отмены любых действий, которые пользователь желает, намного сложнее.