【问题标题】:Command Pattern Undo/Redo: Any issues with my approach?命令模式撤消/重做:我的方法有什么问题吗?
【发布时间】:2011-01-06 15:41:37
【问题描述】:

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

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

【问题讨论】:

    标签: oop design-patterns architecture command-pattern


    【解决方案1】:

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

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

    听起来你的分层对象可能是http://en.wikipedia.org/wiki/Composite_pattern,所以请看一下四人组书中的宏命令。还评论:http://en.wikipedia.org/wiki/Command_pattern

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

    【讨论】:

    • 是的,我也开始这么想了。如果代码在命令对象中,则意味着层次对象可以被修改,命令历史不会被保存。
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2016-11-18
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2015-06-22
    • 2016-03-21
    相关资源
    最近更新 更多