2009-01-12 59 views
8

我試圖執行撤消/重做功能到我的應用程序,使用Command Pattern。我正面臨一個問題。撤消/重做與級聯刪除

爲了說明這一點,我們假設您可以使用我的應用程序創建2D配置文件(儘可能多)。

從這些2D配置文件中,可以創建具有不同屬性(名稱,顏色,比例等)的3D零件。

+--------------+    +--------------+  +--------------+ 
| 2D profile A |    | 2D profile B |  | 2D profile C | 
+--------------+    +--------------+  +--------------+ 
    | |       | 
    | +---------------+  +---------------+ 
    | | 3D Part B  |  | 3D Part C  | 
    | | Colour : blue |  | Colour : grey | 
    | | Name : bibi |  | Name : foo | 
    | | Scale : 33% |  | Scale : 100% | 
    | +---------------+  +---------------+ 
+--------------+ 
| 3D Part A | 
| Colour : red | 
| Name : aaa | 
| Scale : 50% | 
+--------------* 

當一個文件被刪除,其中一個建在此配置文件所有的3D部分automaticaly刪除過(當一個輪廓是即將被刪除,一個3D零件管理器被通知,並會刪除過時的3D部分。視圖也會通知更新GUI)。

這是我現在面臨一個問題:我寫了撤銷/刪除一個2D的輪廓,這看起來是這樣的(僞代碼)重做命令:

virtual void redo() 
{ 
    m_pProfileList.remove(m_pProfile); // This will automatically delete all 3D parts relying on the deleted 2D profile 
} 

virtual void undo() 
{ 
    m_pProfileList.add(m_pProfile); // This will add the 2D profile, but the 3D Parts are lost 
} 

,你可以在上面的代碼中看到,刪除2D配置文件會自動刪除所有依賴於已刪除配置文件的3D部件。

但是,當做撤銷時,重新添加2D配置文件到列表是不夠的:3D部件丟失。

我該怎麼辦?撤消/重做命令是否應負責刪除3D零件(這是3D零件管理器實際完成的事情)?這意味着撤銷/重做命令也將負責通知視圖更新GUI。

還是應該撤消/重做命令創建一個所有3D零件的內部副本,這些零件將被刪除並讓3D零件管理器刪除3D零件?

或者還有其他更好的解決方案嗎?

感謝您的幫助!

回答

1

你想對此稍作變化:Memento pattern。您可以存儲完整對象樹的快照,也可以存儲每次更改時的所有差異。隨着這個連續的歷史變化,你可以通過命令向後和向前進入你的內容,而不會丟失依賴對象。