我正在尋找一種命令模式來支持我的應用程序中的撤銷/重做。數據緊密聯繫在一起,因此修改我想要撤消的某些對象的某些下游後果。我主要關心的是我應該把執行下游命令的代碼放在哪裏。例如:命令模式撤銷/重做:我的方法有何問題?
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