我試圖執行撤消/重做功能到我的應用程序,使用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零件?
或者還有其他更好的解決方案嗎?
感謝您的幫助!