三種方法實現多級撤消 重做

2021-09-22 13:47:00 字數 1312 閱讀 9892

對於撤消/重做沒有乙個通用的解決方案,撤消/重做對每個應用程式都是特定的。這裡有三種方法去實現撤消/重做操作。你可以比較一下每一種實現的方法,選擇一種最適合你的。

第一種方法用在乙個wpf 的商業程式中,那時候還沒有任何關於設計模式的概念。當學習了一些設計模式的知識之後,發現這個解決方案有很多設計上的問題。

撤消/恢復實現的基本思路:

應用程式在每次操作之後都改變了他的狀態。也就是說乙個應用程式一旦被操作,它的狀態就會被改變。如果要撤消到以前的狀態,在應用程式執行的時候,我們必須儲存它的狀態。為了支援重做,我們還必須從當前的狀態回到下乙個狀態。

為了實現撤消儲存應用程式的狀態以前的狀態,為了實現重做儲存應用程式的狀態下一狀態。解決方案就是維護應用程式的狀態來實現撤銷/重做。在三種實現方法中,都使用可兩個棧。乙個存放撤消操作的狀態,另外乙個存放重做操作的狀態。執行撤消操作,撤消堆疊彈出 ,就能得到應用程式的前乙個狀態。執行重做操作,重做堆疊彈出,獲取下乙個狀態。然後用它們來設定應用程式的狀態。

所以,為了實現撤銷、重做操作,關鍵問題就在於如何儲存和維護應用程式執行中的各種狀態。

方法1,用乙個物件代表變化:

將每次單一的操作導致的變化被記錄成為乙個狀態,將狀態變更儲存在乙個物件中,因為這個物件的要代表了應用程式中的所有操作變化,所以這個物件中的會有很多屬性是冗餘的。每執行一項操作,你都要建立乙個這種型別的物件。你可能只使用了這個物件的少數屬性,其它的屬性沒有被使用。例如:在你的應用程式中有兩個操作:乙個是改變高度,乙個是改變寬度。這種情況下,這個物件包含兩個屬性:height 和width。執行高度變化的方法,當您建立這個型別的物件,你只會設定物件改變的高度字段,而寬度欄位未被使用。

方法2使用了命令模式,使用 icommand 物件儲存單一操作的變化,icommand 是所有命令需要實現的介面。

inte***ce

icommand 

對於乙個新增命令:

在undoredo類中存在兩個stack:

方法3,使用備忘錄模式,將應用程式中的乙個主要物件作為應用程式的狀態的備忘錄。

總結:

三種方法最大的區別是兩個棧裡面的物件不同,第一種方法,棧裡面的物件是乙個自定義類的物件。第二種方式中,棧裡面存放的物件是icommand物件,第三種,存放的是你應用程式主要改變的物件(如:畫布容器)的乙個拷貝。

這裡我只做了乙個簡單介紹,目的是把這三個方法推薦給大家,以及尋找更優的方案。

具體實現方式和**:

三種方法實現選擇問題

一 選擇問題 選擇問題 selection problem 是求一陣列 n個數 中第k k n 個最小元素的問題。二 三種方法實現 1.確定演算法 lomuto劃分 hoare劃分 2.非確定演算法 概率演算法 sherwood演算法 三 lomuto劃分1 include include usin...

三種方法 2020 11 23

利用連線類,例項化得到連線物件 連線類 連線物件 new 連線類 cmd.executescalar cmd.excutereader 關注其中一條資料 物件名.read 獲取關注列所對應的值 console.writeline 物件名 name while 物件名.read 功能,聚焦下一行資料。...

三種方法實現CSS三欄布局

本文由雲 社群發表 本文會分別介紹三種css實現三欄布局的方法,可在瀏覽器中開啟檢視效果 實現方法 需要左欄向左浮動,右欄向右浮動,中間設左右margin來撐開距離 doctype html en utf 8 css實現三欄布局1 title text css body left middle ri...