我在寫一個位圖編輯器,我使用命令模式來表示將轉換文檔的操作。我將目前爲止執行的所有命令保存在列表中,爲了實現撤消,我將文檔恢復到其初始狀態,然後重播除最後一個命令以外的所有命令。實現強大的持久撤消/重做功能
我想我的撤銷/重做系統具有以下功能:當用戶關閉編輯器並返回,文檔,包括可用的撤消和重做命令,應恢復到時它所處的狀態用戶離開了。
我正在實施這個Android應用程序可以在它從內存中清除之前給予很少的注意,例如,用戶接到電話。另外,我的一些命令是例如所有這些用戶繪製的x,y合作伙伴的列表,因此這些可能需要一些時間來保存到磁盤。
我現在的想法是:
- 當執行一個新的動作,命令對象添加到列表■對於需要保存到磁盤的命令。
- 使用後臺線程將不斷地從列表S獲取命令並將其保存到磁盤。所用文件名的後綴將按順序編號。例如,如果用戶填充了屏幕,然後畫了2個圓圈,則命令文件可能被稱爲FillCommand1.cmd,DrawCircleCommand2.cmd,DrawCircleCommand3.cmd。
- 我們定期保存一個「檢查點」命令,其目的是存儲完整的文檔狀態,以便即使其中一個.cmd文件被損壞,我們也可以恢復最近的文檔版本。
- 當用戶退出應用程序時,後臺線程會嘗試完成保存所有可能的命令(但可能會被終止)。
- 在啓動時,我們尋找最近的.cmd文件,它代表我們可以成功加載的檢查點。在這之後我們可以加載的所有.cmd文件(即某些文件可能已損壞)進入重做命令列表,我們可以加載第一個檢查點和我們可以加載的最舊檢查點之間加載的所有.cmd文件進入撤消列表。
我想撤消限制爲大約20或30的命令回來,所以我需要額外的邏輯丟棄命令,刪除.cmd文件的,我得擔心多線程行爲。這個系統看起來很複雜,需要大量的測試來確保它不會出錯。
Java或Android中有什麼可以幫助簡化這一點嗎?我是否在任何地方重塑車輪?也許數據庫會更好?
「這個系統看起來很複雜,需要進行大量的測試以確保它不會出錯。」歡迎來到現實世界中的應用程序。一個函數式編程風格可能會幫助(留下舊值 - 不解決應用程序退出/持久性問題),但是你可能會遇到內存使用問題。 「...一個數據庫......」這可能有助於速度,但它不會從根本上讓它變得更容易,我不相信。除非你有一個內置歷史的類似git的數據庫。 – 2010-10-27 23:54:11
大多數位圖編輯器操作具有破壞性,所以函數式編程風格方法對我看不出太多幫助。 – RichardNewton 2010-10-28 00:26:37
沒錯。但是如果你的代碼是返回NewBitmap的Execute(Bitmap,Action),那麼你將擁有你的狀態。當然這會強制複製你可能不想要的位圖。僅僅因爲典型的方法是破壞性的並不意味着沒有其他的方法(儘管在大多數情況下,用手工抄錄破壞性可能更好)。你選擇存儲狀態的方法可能就是你想要的。 – 2010-10-28 18:34:44