我正在寻找实现一个命令模式来支持我的应用程序中的撤消/重做。数据非常紧密地联系在一起,因此修改我的一些对象会产生一些下游后果,我也希望能够撤消这些结果。我主要关心的是我应该将执行下游命令的代码放在哪里。例如:
class:MoveObjectCommand
{
private hierarchicalObject:internalObject;
public MoveObjectCommand(hierarchicalObject:newObject)
{
internalObject = newObject;
}
public Execute()
{
internalObject.Location = someNewLocation;
foreach(hierarchicalObject:child in internalObject.Children)
{
if(someNewLocation = specialPlace)
{
var newCommand:MoveObjectCommand = new MoveObjectCommand(child)
CommandManager.add(newCommand);
}
}
}
public Undo()
{
internalObject.location = oldLocation;
}
}
据我所知,这样的事情会很好,但我无法理解大部分执行代码实际应该去的地方。hierarchyObject 是否应该有一个 .changeLocation() 方法来添加所有后续命令,还是应该像上面一样在命令本身中?我能想到的唯一区别是,在上面的示例中,必须调用 MoveObjectCommand 才能对流程进行后续更改,而另一种方式可以在不需要命令的情况下调用它并且仍然以相同的方式处理(可能会产生负面影响用于跟踪撤消/重做步骤)。这是我想太多了吗?你会把它放在哪里以及为什么(显然这个例子并没有涉及所有角度,但是命令模式的任何一般最佳实践?)。