我正在寻找一种命令模式来支持我的应用程序中的撤销/重做。数据紧密联系在一起,因此修改我想要撤消的某些对象的某些下游后果。我主要关心的是我应该把执行下游命令的代码放在哪里。例如:命令模式撤销/重做:我的方法有何问题?
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;
}
}
据我所知,像这样的工作是很好,但我不能完成我的周围,其中大部分的代码执行的实际上应该去头。 hierarchicalObject是否应该有一个.changeLocation()方法来添加所有后续的命令,或者它们是否应该像上面那样在命令中?我可以想到的唯一区别是,在上面的例子中,必须调用MoveObjectCommand来处理后续的更改,而另一种方式则可以在不需要命令的情况下调用,并且仍然以相同的方式处理(可能会产生负面影响用于跟踪撤消/重做步骤)。我是否在说这个?你会在哪里放置它,为什么(显然这个例子并没有达到所有的角度,但是使用命令模式的任何一般最佳实践?)。
是的,我开始思考这个问题后想了一下。如果代码位于命令对象中,则意味着可以修改hierarchicalObject并且不会保存命令历史记录。 – Ocelot20 2011-01-06 19:10:57