亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

撤消引擎的設計模式

撤消引擎的設計模式

開心每一天1111 2019-12-09 10:20:44
我正在為民用工程應用程序編寫結構建模工具。我有一個代表整個建筑物的巨大模型類,其中包括節點,線元素,荷載等的集合,它們也是自定義類。我已經編碼了一個撤消引擎,該引擎在對模型進行每次修改后都保存了一個深拷貝。現在,我開始考慮是否可以使用其他代碼進行編碼。除了保存深層副本之外,我還可以保存每個修改器動作的列表以及相應的反向修改器。這樣我就可以將反向修改器應用于當前模型以撤消,或將修改器應用于重做。我可以想象您將如何執行更改對象屬性等的簡單命令。但是復雜命令呢?就像將新的節點對象插入模型并添加一些線對象以保留對新節點的引用一樣。如何實施呢?
查看完整描述

3 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

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


查看完整回答
反對 回復 2019-12-09
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

我認為在處理OP所暗示的規模和范圍模型時,紀念品和命令都不實用。它們會起作用,但是維護和擴展將需要大量工作。

對于此類問題,我認為您需要建立對數據模型的支持,以支持模型中涉及的每個對象的差異檢查點。我曾經做過一次,而且效果很好。您要做的最大事情是避免在模型中直接使用指針或引用。

每個對另一個對象的引用都使用一些標識符(例如整數)。只要需要該對象,就可以從表中查找該對象的當前定義。該表包含每個對象的鏈接列表,每個對象都包含所有以前的版本,以及有關它們針對哪個檢查點處于活動狀態的信息。

撤消/重做的實現很簡單:執行您的操作并建立一個新的檢查點;將所有對象版本回滾到先前的檢查點。

它在代碼中需要一定的紀律,但是卻具有許多優點:因為您正在對模型狀態進行差異存儲,所以您不需要深層副本。您可以根據重做次數或使用的內存來確定要使用的內存量(對于CAD模型之類的數據非常重要);模型上運行的功能具有高度的可擴展性和低維護性,因為它們無需執行任何操作即可實現撤消/重做。


查看完整回答
反對 回復 2019-12-09
?
牛魔王的故事

TA貢獻1830條經驗 獲得超3個贊

正如其他人所述,命令模式是實現撤消/重做的一種非常強大的方法。但是我想提及命令模式有一個重要的優勢。

使用命令模式實現撤消/重做時,可以通過抽象化(在某種程度上)對數據執行的操作并在撤消/重做系統中利用這些操作來避免大量重復的代碼。例如,在文本編輯器中,剪切和粘貼是互補的命令(除了剪貼板的管理之外)。換句話說,剪切的撤消操作是粘貼,剪切的撤消操作被剪切。這適用于更簡單的操作,例如鍵入和刪除文本。

關鍵是可以將撤消/重做系統用作編輯器的主要命令系統。無需編寫“創建撤消對象,修改文檔”之類的系統,而是可以“創建撤消對象,對撤消對象執行重做操作以修改文檔”。

現在,誠然,許多人都在想:“好吧,這不是命令模式的重點嗎?” 是的,但是我看到太多的命令系統具有兩組命令,一組用于立即操作,另一組用于撤消/重做。我并不是說不會有特定于立即操作和撤消/重做的命令,但是減少重復將使代碼更具可維護性。


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 534 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號