3 回答

TA貢獻1869條經驗 獲得超4個贊
我見過的大多數示例為此使用了Command-Pattern的變體。每個無法撤消的用戶操作都會獲取其自己的命令實例,該實例包含所有信息以執行該操作并將其回滾。然后,您可以維護所有已執行命令的列表,然后可以將它們逐一回滾。

TA貢獻1744條經驗 獲得超4個贊
我認為在處理OP所暗示的規模和范圍模型時,紀念品和命令都不實用。它們會起作用,但是維護和擴展將需要大量工作。
對于此類問題,我認為您需要建立對數據模型的支持,以支持模型中涉及的每個對象的差異檢查點。我曾經做過一次,而且效果很好。您要做的最大事情是避免在模型中直接使用指針或引用。
每個對另一個對象的引用都使用一些標識符(例如整數)。只要需要該對象,就可以從表中查找該對象的當前定義。該表包含每個對象的鏈接列表,每個對象都包含所有以前的版本,以及有關它們針對哪個檢查點處于活動狀態的信息。
撤消/重做的實現很簡單:執行您的操作并建立一個新的檢查點;將所有對象版本回滾到先前的檢查點。
它在代碼中需要一定的紀律,但是卻具有許多優點:因為您正在對模型狀態進行差異存儲,所以您不需要深層副本。您可以根據重做次數或使用的內存來確定要使用的內存量(對于CAD模型之類的數據非常重要);模型上運行的功能具有高度的可擴展性和低維護性,因為它們無需執行任何操作即可實現撤消/重做。

TA貢獻1830條經驗 獲得超3個贊
正如其他人所述,命令模式是實現撤消/重做的一種非常強大的方法。但是我想提及命令模式有一個重要的優勢。
使用命令模式實現撤消/重做時,可以通過抽象化(在某種程度上)對數據執行的操作并在撤消/重做系統中利用這些操作來避免大量重復的代碼。例如,在文本編輯器中,剪切和粘貼是互補的命令(除了剪貼板的管理之外)。換句話說,剪切的撤消操作是粘貼,剪切的撤消操作被剪切。這適用于更簡單的操作,例如鍵入和刪除文本。
關鍵是可以將撤消/重做系統用作編輯器的主要命令系統。無需編寫“創建撤消對象,修改文檔”之類的系統,而是可以“創建撤消對象,對撤消對象執行重做操作以修改文檔”。
現在,誠然,許多人都在想:“好吧,這不是命令模式的重點嗎?” 是的,但是我看到太多的命令系統具有兩組命令,一組用于立即操作,另一組用于撤消/重做。我并不是說不會有特定于立即操作和撤消/重做的命令,但是減少重復將使代碼更具可維護性。
- 3 回答
- 0 關注
- 534 瀏覽
添加回答
舉報