2011-01-06 43 views
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; 
    } 
} 

据我所知,像这样的工作是很好,但我不能完成我的周围,其中大部分的代码执行的实际上应该去头。 hierarchicalObject是否应该有一个.changeLocation()方法来添加所有后续的命令,或者它们是否应该像上面那样在命令中?我可以想到的唯一区别是,在上面的例子中,必须调用MoveObjectCommand来处理后续的更改,而另一种方式则可以在不需要命令的情况下调用,并且仍然以相同的方式处理(可能会产生负面影响用于跟踪撤消/重做步骤)。我是否在说这个?你会在哪里放置它,为什么(显然这个例子并没有达到所有的角度,但是使用命令模式的任何一般最佳实践?)。

回答

2

听起来像你应该有模型中的changeLocation()方法(hierarchicalObject我假设)。只需在命令中存储新的位置和对象。

撤销/重做您需要一个或两个命令。

与您的hierarchicalObject类似的声音可能是http://en.wikipedia.org/wiki/Composite_pattern,因此请仔细阅读四人组书中的宏命令。还审查:http://en.wikipedia.org/wiki/Command_pattern。 Christopher Alexander说:“每种模式都描述了一个在我们的环境中反复出现的问题,然后描述解决方案的核心问题,以便您可以使用此解决方案一百万次以上,而不是以同样的方式进行两次“。

+0

是的,我开始思考这个问题后想了一下。如果代码位于命令对象中,则意味着可以修改hierarchicalObject并且不会保存命令历史记录。 – Ocelot20 2011-01-06 19:10:57