在Java中实现undo以进行状态更改

时间:2011-07-01 11:16:42

标签: java design-patterns undo-redo

我开始实现命令模式,希望能够为我提供撤消操作的问题找到有用的解决方案。现在我面临一个问题:

当涉及操作时实现撤销相当容易:当我向数字添加5时,我减去5.当我将对象添加到列表中时,我将其删除,依此类推。但是如果我有一个完整的状态而不是列表呢?

一个例子:我为类中的线程建模信息:

public class ThreadInfo implements Comparable<ThreadInfo> {

    final int id;
    String name;
    int priority;
    String state;
    int waitCount;
    // ...
}

某些信息不会改变,例如id。如上所述,撤消waitCount很容易,只需减去。但是prioritystate呢?目前尚不清楚如何撤消这些信息。

我提出的唯一想法:初始化命令对象时,保留其对象中的旧状态:将相关数据传递给构造函数:

public MyCommand(int priority, String state) {
   previousPriority = priority;
   previousState = state;
}

或者让ThreadInfo列出状态和优先级列表作为当前的第一个元素会更好吗?

4 个答案:

答案 0 :(得分:4)

掌握旧状态。例如

 class ChangeFoo {
    ChangeFoo (Bar bar, foo newFoo){}
    void execute(){
        oldFoo = bar.getFoo();
        bar.setFoo(newFoo);
    }
    void undo(){
        bar.setFoo(oldFoo);
    }
 }

答案 1 :(得分:2)

我会选择第一个解决方案:保存状态的MyCommand构造函数。它很简单,应该可行。有关更一般的撤消/重做方法,请查看memento pattern。您可以将它与基于命令的方法结合起来。

答案 2 :(得分:0)

Java已经支持撤消/重做操作。看看这个tutorial。 您可以扩展AbstractUndoableEdit类来定义对象上的撤消/重做操作的语义。

答案 3 :(得分:0)

最好在命令方法中备份旧对象。 我已经使用过这种方法了。