Как делает undo
работа? Это копирует все управляемые объекты каждый раз какое-либо изменение значений? Или это только копирует фактические изменения вместе с информацией, какие объекты были затронуты? Это тяжело или легко?
Механизм "отмены" для практически любого языка, поддерживающего объектно-ориентированные конструкции, использует паттерн проектирования Memento, чтобы сделать это.
Вот примерная реализация, чтобы вы задумались. Это обрабатывает ваш стек отменяемых операций. (Он не обрабатывает повтор, но это легко поддержать, заменив стек списком и отслеживая текущий элемент.)
public class Undoable {
public static void Do(Action do, Action undo) {
do();
sUndoStack.Push(new Undoable(do, undo));
}
public static void Undo() {
sUndoStack.Pop().mUndoCallback();
}
private Undoable(Action doCallback, undoCallback) {
mDoCallback = doCallback;
mUndoCallback = undoCallback;
}
private Action mDoCallback, mUndoCallback;
// note: using a global stack here is lame, but works for demo purposes
private static readonly Stack<Undoable> sUndoStack = new Stack<Undoable>();
}
Чтобы использовать это, скажем, пользователь может изменить значение в каком-то объекте, например:
public class Foo {
public string Bar {
get { return mBar; }
set {
if (mBar != value) {
mBar = value;
}
}
}
private string mBar;
}
Чтобы сделать эту операцию отключаемой, мы просто меняем установщик на:
set {
if (mBar != value) {
string oldValue = mBar;
Undoable.Do(() => mBar = value,
() => mBar = oldValue);
}
}
Теперь, если вы вызовете Undoable.Undo () из любого места приложения, ваш экземпляр Foo восстановит предыдущее значение Bar. Если Foo также вызывает событие при изменении Bar (здесь не показано), пользовательский интерфейс также будет правильно обновляться при отмене.