2010-12-13 2 views
8

В моем приложении я хочу предоставить пользователю небольшую функциональность отмены. Пользователем не так много действий, которые могут быть отменены пользователем. В частности, эти действия являются:Как реализовать функциональность отмены?

  • Добавление примечаний к объекту
  • Цвет объекта
  • тег objcet со строкой

Теперь я думал о том, как осуществить это. Сначала я подумал о классе Action, который является абстрактным базовым классом для трех различных действий, которые могут быть предприняты пользователем. Каждый раз, когда пользователь берет на себя эти действия, создается новый соответствующий экземпляр подкласса этого абстрактного класса Action и вставляется в список, содержащий все действия.

Всякий раз, когда пользователь хочет что-то отменить, список отображается пользователю, и он может выбрать, какое действие он хочет отменить.

Теперь я думал, что должно быть сохранено в таком объекте действия:

  • состояние объекта перед действием
  • реальное действие, которое было принято (например, строка, которая была добавлена ​​к примечания объекта)

Я не уверен, что этого достаточно. Я также думал о чем-то вроде хронологического упорядочения, но это необходимо, так как список можно сохранить хронологически правильным.

Есть ли другие вещи, которые я должен рассмотреть?

+1

Поиск шаблона замещения в GOF – pastjean

+2

Или шаблон команды – slayerIQ

+1

См. Также здесь: http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine –

ответ

14

Отменить/повторить обычно дополняется Command Pattern. Класс Action может использоваться в качестве основы для этого, но вам нужно выполнить действие «do» и «отменить» в каждой команде. Here is an example этого на практике. Вероятно, вы должны хранить команды, выполняемые в стеке, поскольку это значительно упрощает реализацию и намного проще для пользователя.

2

Все кажется правильным, но я бы предпочел использовать стек, чем список. Это будет полезно в аспекте хронологического упорядочения.

2

Для правильного и проверенного implememtation для функциональности UNDO является команда

9

Вы могли бы сделать что-то простое, как это:

Stack<Action> undoStack = new Stack<Action>();  

void ChangeColor(Color color) 
{ 
    var original = this.Object.Color; 
    undoStack.Push(() => this.Object.Color = original); 
    this.Object.Color = color; 
} 
+0

Мне это нравится. Никогда не думал о сохранении реальных действий ... очень приятно. – Crisfole

 Смежные вопросы

  • Нет связанных вопросов^_^