3 回答

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

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

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