C# 如何实现撤销功能?

C# 如何实现撤销功能?,c#,.net,architecture,system-design,C#,.net,Architecture,System Design,在我的应用程序中,我想为用户提供一个小的撤销功能。用户可以撤消的操作不多。具体行动包括: 向对象添加注释 给物体上色 用字符串标记对象集 现在我在想如何实现这一点。我首先想到一个Action类,它是用户可以执行的3种不同操作的抽象基类。每次用户执行这些操作时,都会创建此抽象操作类的子类的一个新的适当实例,并将其插入到包含所有操作的列表中 每当用户想要撤消某项操作时,列表都会显示给用户,用户可以选择要撤消的操作 现在我在想,在这样一个动作对象中必须存储什么: 操作之前对象的状态 实际执行的操

在我的应用程序中,我想为用户提供一个小的撤销功能。用户可以撤消的操作不多。具体行动包括:

  • 向对象添加注释
  • 给物体上色
  • 用字符串标记对象集
现在我在想如何实现这一点。我首先想到一个Action类,它是用户可以执行的3种不同操作的抽象基类。每次用户执行这些操作时,都会创建此抽象操作类的子类的一个新的适当实例,并将其插入到包含所有操作的列表中

每当用户想要撤消某项操作时,列表都会显示给用户,用户可以选择要撤消的操作

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

  • 操作之前对象的状态
  • 实际执行的操作(例如,添加到对象注释中的字符串)
我不确定这是否足够。我还考虑过按时间顺序排序,但这应该是必要的,因为列表可以按时间顺序保持正确


<> P/>是否有其他的事情要考虑?

< P>为撤销功能的正确和实现的实现是命令模式< /P> < P>你可以做一些简单的事情:< /P>
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;
}
Stack undoStack=新堆栈();
void ChangeColor(颜色)
{
var original=this.Object.Color;
undoStack.Push(()=>this.Object.Color=original);
this.Object.Color=颜色;
}

对于要撤消的每个操作,都应执行命令模式:


撤消/重做通常使用来实现。
Action
类可以用作此操作的基础,但每个命令中都需要一个“do”操作和一个“undo”操作。这一点在实践中得到了证实。
您可能应该将执行的命令存储在堆栈中,因为这样可以更容易地实现,用户也更容易遵循。

在现有项目中添加撤消/重做功能时,很难忽略这一点。

在GOFSee中搜索memento模式也在此处:我喜欢这一个。从来没有想过存储实际行动…非常好。