如何实现撤消功能?

8 .net c# architecture system-design

在我的应用程序中,我想为用户提供一个小的撤消功能.用户没有多少动作可以撤消.特别是行动是:

  • 添加注释到对象
  • 为对象着色
  • 使用字符串标记objcet

现在我想到了如何实现这一点.我首先想到的是一个Action类,它是用户可以采取的3种不同操作的抽象基类.每次用户执行这些操作时,都会创建此抽象Action类的子类的新适当实例,并将其插入包含所有操作的列表中.

每当用户想要撤消某些内容时,该列表将显示给用户,并且他可以选择要撤消的操作.

现在我在想什么必须存储在这样的动作对象中:

  • 在行动之前的对象的状态
  • 采取的实际操作(例如添加到对象注释中的字符串)

我不确定这是否足够.我还考虑过按时间顺序排序,但这应该是必要的,因为列表可以按时间顺序保持正确.

还有其他我应该考虑的事情吗?

Dr *_*bie 15

撤消/重做通常使用命令模式实现.该Action班可被用作此基础上,但你需要一个"做"的行动并在每个命令中的"撤消"动作. 这是实践中的一个例子.您应该存储在堆栈中执行的命令,因为它使实现更容易,并且用户更容易遵循.


Cha*_*ion 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;
}
Run Code Online (Sandbox Code Playgroud)


ArB*_*rBR 5

您应该为要撤消的每个操作实现命令模式:

如何在不重大程序更改的情况下实现撤消/重做操作