Как Отмена работает?

Как делает undo работа? Это копирует все управляемые объекты каждый раз какое-либо изменение значений? Или это только копирует фактические изменения вместе с информацией, какие объекты были затронуты? Это тяжело или легко?

5
задан George Stocker 10 June 2010 в 16:05
поделиться

2 ответа

Механизм "отмены" для практически любого языка, поддерживающего объектно-ориентированные конструкции, использует паттерн проектирования Memento, чтобы сделать это.

2
ответ дан 15 December 2019 в 06:16
поделиться

Вот примерная реализация, чтобы вы задумались. Это обрабатывает ваш стек отменяемых операций. (Он не обрабатывает повтор, но это легко поддержать, заменив стек списком и отслеживая текущий элемент.)

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 (здесь не показано), пользовательский интерфейс также будет правильно обновляться при отмене.

1
ответ дан 15 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: