我开始实现命令模式,希望能够为我提供撤消操作的问题找到有用的解决方案。现在我面临一个问题:
当涉及操作时实现撤销相当容易:当我向数字添加5时,我减去5.当我将对象添加到列表中时,我将其删除,依此类推。但是如果我有一个完整的状态而不是列表呢?
一个例子:我为类中的线程建模信息:
public class ThreadInfo implements Comparable<ThreadInfo> {
final int id;
String name;
int priority;
String state;
int waitCount;
// ...
}
某些信息不会改变,例如id。如上所述,撤消waitCount
很容易,只需减去。但是priority
或state
呢?目前尚不清楚如何撤消这些信息。
我提出的唯一想法:初始化命令对象时,保留其对象中的旧状态:将相关数据传递给构造函数:
public MyCommand(int priority, String state) {
previousPriority = priority;
previousState = state;
}
或者让ThreadInfo
列出状态和优先级列表作为当前的第一个元素会更好吗?
答案 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)
最好在命令方法中备份旧对象。 我已经使用过这种方法了。