2011-01-06 44 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