2

我正在寻找实现一个命令模式来支持我的应用程序中的撤消/重做。数据非常紧密地联系在一起,因此修改我的一些对象会产生一些下游后果,我也希望能够撤消这些结果。我主要关心的是我应该将执行下游命令的代码放在哪里。例如:

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 才能对流程进行后续更改,而另一种方式可以在不需要命令的情况下调用它并且仍然以相同的方式处理(可能会产生负面影响用于跟踪撤消/重做步骤)。这是我想太多了吗?你会把它放在哪里以及为什么(显然这个例子并没有涉及所有角度,但是命令模式的任何一般最佳实践?)。

4

1 回答 1

2

听起来你应该在模型中有 changeLocation() 方法(我认为是 hierarchicalObject )。只需将新位置和对象存储在命令中即可。

对于撤消/重做,您将需要一两个命令列表。

听起来您的分层对象可能是http://en.wikipedia.org/wiki/Composite_pattern,因此请看一下四人组书中的宏命令。还审查:http ://en.wikipedia.org/wiki/Command_pattern 。

Christopher Alexander 说:“每个模式都描述了一个在我们的环境中反复出现的问题,然后描述了该问题解决方案的核心,以这样一种方式,您可以使用该解决方案一百万次,而无需执行同样的方式两次”。

于 2011-01-06T18:04:02.573 回答