2016-12-13 76 views
0

到目前爲止,我在網上找到的所有例子和教程都處理了對值進行加或減或其他操作的命令 - 計算器就是常見的例子。無關命令的命令設計模式

但是,如果您的命令行爲與計算器中的命令不相似,該怎麼辦?

想象一下像Microsoft Visio這樣的繪圖程序,用戶在屏幕上將對象放置並移動到x和y位置。或者添加和刪除一個對象。這些命令是不相關的,因此,如果堆棧中的下一個命令是需要撤消的create object命令,那麼跟蹤當前的x,y位置就沒有意義。

任何建議如何處理?

+0

命令模式不是_really_提供「撤消」。它的核心是它提供了一種方法來將實現與您正在執行的操作分離開來,例如,如果您有一個按鈕將使用Command模式將對象移動到屏幕中間,則按鈕只會調用像' moveToMiddle(obj)' - 它不需要知道「真正的」實現是'obj.setX(width/2); obj.setY(height/2)',因爲這個實現可以改變。如果你想撤消,看看Redux做了什麼 - 每個命令都是一個修改,你可以通過應用相反的方法將它們回滾。 – vlaz

+1

但是,這依賴於保持一致的狀態。對於更「放鬆」的解決方案,您可以將Command和Memento結合起來,以便保留之前發生的事情的快照。這種回滾命令的方式是恢復快照。 – vlaz

回答

0

假設「在軸上移動對象」+正確的命令是「對象」。然後命令模式處理該對象和包含的命令。所以命令模式並不牽涉到「保存該對象的狀態」。每一次,無論輸入對象是相同的還是不同的。

在計算器的情況下,「刪除命令」將與「刪除對象命令」相同。

在這個討論之前,你使用命令模式移動物體的目的是什麼?

+0

我目前不使用命令模式。我正在考慮將它作爲向我的應用程序添加撤銷/重做功能的解決方案。我在這裏發現了這個類似的問題http://stackoverflow.com/questions/3250104/fast-undo-redo-with-memento-command-pattern – sjs