Я настоятельно рекомендую вам взглянуть на шаблон команды:
По сути, это включает создание подклассов «Команда» для каждого типа действияпользователь может выполнять - и помещать их в стек после выполнения команды.
Каждая команда знает, как «делать» себя, а также «отменять» себя.
Таким образом, отмена - это относительно простой процесс извлечения команд из стека и вызова для них метода отмены.
Поскольку каждый экземпляр Команды может содержать свое собственное состояние («параметры»), вы можете заранее создать именно те команды, которые хотите использовать, и «пакетировать» их, чтобы получить искомый результат.,
псевдокод:
public class ImageEditor
{
public Stack<Command> undoList = new Stack<Command>();
public void executeCommand(Command command)
{
command.performAction(this);
undoList.push(command);
}
public void undo()
{
undoList.peek().undoAction(this);
undoList.pop();
}
}
public interface ICommand
{
void performAction(ImageEditor editor);
void undoAction(ImageEditor editor);
}
public class CreateBorderCommand : ICommand
{
public int BorderWidth { get; set; }
private Border MyBorderBox { get; set; }
public void performAction(ImageEditor editor)
{
MyBorderBox = new Border(BorderWidth, editor.frame);
editor.addElement(MyBorderBox);
}
public void undoAction(ImageEditor editor)
{
editor.removeElement(MyBorderBox);
}
}
Позже:
ImageEditor editor = new ImageEditor();
editor.executeCommand(new CreateBorderCommand() { BorderWidth = 10 });
...
Если вы действительно хотите, вы можете сделать его немного более сложным и сделать всеСериализуемые определения команд - позволяют создавать их список, читать их и выполнять позже.