我有一個C++應用程序,根據經典Model-View-Controller pattern設計。該模型通過控制器接口由外部源通過Command pattern進行修改。這些命令由一個Action對象(及其派生物)表示。在MVC設計中撤銷功能
現在我想能夠撤消修改,但我的問題是我沒有在我的控制器中的getters,只有setter。這似乎很合乎邏輯,因爲沒有理由有人應該能夠通過控制器獲得關於模型的信息。因此,我無法讓Action對象存儲模型的狀態,因爲他們無法訪問它。
如何解決這個問題?我想保留我的應用程序儘可能擴展,我不太確定哪個選項最適合。我到目前爲止的方法是:
- 將getter方法放在控制器中。這似乎違背了MVC模式。
- 給動作一個指向視圖的指針。然後,該操作可以:
- 使用單個獲取器來獲取要修改的模型的特定元素的狀態。
- 使用由查看器實現的Memento方法。
也許還有更好的方法來做到這一點?現在,成爲最好的選擇似乎是2,子選項1(子選項2,我可能存儲更多的狀態比撤消一個動作所需的更多)。
注:我知道還有關於如何實現撤消操作的其他問題。然而,我發現的唯一答案給了使用Command或Memento模式的建議。我知道這是最有可能的路要走。我所要求的是如何在MVC設計中儘可能地將其擴展爲可擴展的。
[編輯]我不喜歡的紀念圖案是它迫使我存儲一個完整的狀態。假設我的模型是一個1000x1000矩陣,我的命令是ChangeOneValueAtLocation。爲了能夠撤銷它的更改,ChangeOneValueAtLocation對象只需要存儲它正在改變的位置的先前值,但對於Memento來說這似乎不可能。我的模型越大,這個問題就會變得最大。
[編輯2]另一個問題我在本申請的特定情況中具有紀念品:每一個命令對象可以在模型執行方法,有,做完全相反(或可以很容易地被誘導的方法這樣做)。這就是爲什麼我會覺得必須存儲整個狀態是一件很浪費的事情,應該不需要這樣做,恢復單個命令非常簡單,唯一的問題是讓數據能夠做到這一點。
此外,我不需要能夠撤消一個特定的命令,只有在我的歷史堆棧上的最頂層。
我決定採用這種方法,因爲它可以讓我輕鬆地將模型及其相關歷史記錄傳輸到異地客戶端。將歷史記錄放入控制器會使這變得更加困難。此外,我的模型只有一個前端類,所以我不認爲非原子撤銷問題「sehe」提及會成爲問題。 – Darhuuk 2011-04-20 12:11:21