3

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

在涉及操作时实现撤消相当容易:当我将 5 添加到一个数字时,我会减去 5。当我将一个对象添加到列表中时,我将其删除,等等。但是,如果我有一个完整的状态而不是列表之类的东西怎么办?

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

public class ThreadInfo implements Comparable<ThreadInfo> {

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

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

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

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

ThreadInfo还是让一个状态和优先级列表成为当前的第一个元素会更好吗?

4

4 回答 4

5

只需保持旧状态即可。例如

 class ChangeFoo {
    ChangeFoo (Bar bar, foo newFoo){}
    void execute(){
        oldFoo = bar.getFoo();
        bar.setFoo(newFoo);
    }
    void undo(){
        bar.setFoo(oldFoo);
    }
 }
于 2011-07-01T11:22:06.323 回答
2

我会选择第一个解决方案:保存状态的 MyCommand 构造函数。这很简单,应该可以工作。对于更通用的撤消/重做方法,请查看memento pattern。您可能可以将它与基于命令的方法结合使用。

于 2011-07-01T11:21:10.837 回答
0

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

于 2011-07-01T11:21:21.407 回答
0

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

于 2011-07-01T12:00:31.170 回答