Каноническая стратегия заключается в использовании шаблона команды . Вы будете представлять вещи, которые вы можете сделать как объекты Command, и каждый объект помещается в стек. Затем состояние приложения определяется начальным состоянием плюс все, что имеет стек. Таким образом, операция «отмена» - это просто выталкивание верхнего элемента стека и повторное применение оставшихся элементов в исходное состояние.
На практике иногда дорого продолжать применять эти операции к исходному состоянию для генерации текущего состояния. Например, это может быть правдой с чем-то вроде сложной серии настроек изображения, как вы можете найти в Photoshop. В таких случаях обычно хранить в памяти чередующиеся последовательности стеков состояний:
+---------+
| state_0 |
+---------+ +---------+
| next -------> | stack_0 |
+---------+ +---------+
| data | +---------+
| next -------> | state_1 |
+---------+ +---------+
| next ----- ...
+---------+
Каждая stack_i
содержит команды до тех пор, пока не превысит некоторую предварительно установленную сложность (например, команды превышают вычислительную стоимость X
) или порядковый (например, стек содержит X
или более команд) предел. В этот момент создается новый объект промежуточного состояния state_i+1
для инкапсуляции состояния, и создается новый пустой стек stack_i+1
для хранения новых команд.
Таким образом, вам нужно лишь применить небольшую последовательность команд к последнему состоянию моментального снимка, чтобы получить текущее состояние. Это происходит за счет запоминания целых состояний, что может оказаться невозможным для очень больших приложений, но вы можете сделать снимок только для набора состояний для оптимизации.