2013-06-02 40 views
0

我有一個我的大學的項目,我使用PowerDesigner來模擬一個應該是抽象的MS Visio的應用程序,基本上是一個通用的圖形編輯器。命令模式,有什麼資格作爲命令?

我應該實現命令模式,但只關注實際工作空間(而不是層級樹)。現在,我有一個抽象類,它有一個名爲​​的抽象函數和一個名爲undo()的空函數(但不是抽象函數)。這個想法是讓具體的命令覆蓋第一種方法,但只有可撤銷命令覆蓋第二種方法。

我在理解作爲命令的資格方面遇到了一些麻煩。可撤銷的方法有點容易命名,因爲我有MoveResize,Rotate,AlterProperty,DeleteAdd。無法撤銷的命令是問題。

工具欄上的每個動作都是一個命令嗎?我正在考慮把ZoomScroll作爲一個命令,但我不確定這是否會造成分裂。至於Cut,CopyPaste,第一個幾乎是填充Clipboard元素列表,之後Delete命令被調用,而後兩者幾乎增加和從Clipboard列表中刪除,所以我不知道如果我應該把它歸類爲命令。

基本上,問題是 - 如何處理不可撤銷的命令?每個動作應該創建一個命令對象嗎?

回答

2

縮放/滾動 - 爲什麼你認爲它們不可撤銷?撤銷縮放 - >在更改之前設置縮放級別。撤消 - 滾動 - >將位置移回。在每種情況下,他們都會在創建時存儲當前狀態。你是否希望他們進入撤銷隊列是另一回事。

剪切/複製/粘貼 - 一般來說,就撤消而言我並不指望剪貼板狀態發生變化。但是你絕對希望從剪切中刪除和粘貼中的添加是可撤銷的。如果複製N個項目然後粘貼,那是一個添加命令還是多個?如果它是多個,您可能希望剪切/粘貼爲應用添加子命令列表的元命令 - 否則,如果您粘貼N個項目,則必須撤消N次而不是一次。如果它是單個添加,那麼它有點多餘,雖然它可能很適合顯示(例如「撤消粘貼」與「撤消添加...」)

同樣的邏輯適用於剪切。

簡短的回答是:如果代碼中有意義,您可以將每個操作都作爲命令。但它可能是矯枉過正的 - 你也可以在模型和視圖之間分開,只有實際上改變模型的東西是命令/可撤銷的。