2010-06-10 65 views
5

undo如何工作?每當任何值更改時,它是否會複製所有受管對象?或者它只是將實際的變化與對象受到影響的信息一起復制?這是重還是輕?撤消如何工作?

回答

2

幾乎任何支持面向對象構造的語言的「撤消」機制都使用Memento Design Pattern來實現。

+0

這不一定是正確的。紀念品可以燃燒大量的記憶。我一直在使用的應用程序通常使用Command模式,其中每個Command封裝邏輯以執行更改並將其撤消。這樣,你只會花費內存上的對象的前一個狀態和下一個狀態之間的差異。 – munificent 2010-06-11 02:38:40

1

這是一個粗略的實施,讓你思考。這將處理你的一堆可撤銷操作。 (它不處理重做,但是這很容易用一個列表更換堆疊和跟蹤當前項目的支持。)

public class Undoable { 
    public static void Do(Action do, Action undo) { 
     do(); 
     sUndoStack.Push(new Undoable(do, undo)); 
    } 

    public static void Undo() { 
     sUndoStack.Pop().mUndoCallback(); 
    } 

    private Undoable(Action doCallback, undoCallback) { 
     mDoCallback = doCallback; 
     mUndoCallback = undoCallback; 
    } 

    private Action mDoCallback, mUndoCallback; 

    // note: using a global stack here is lame, but works for demo purposes 
    private static readonly Stack<Undoable> sUndoStack = new Stack<Undoable>(); 
} 

要利用這一點,讓我們說,用戶可以在某些更改值對象是這樣的:

public class Foo { 
    public string Bar { 
     get { return mBar; } 
     set { 
      if (mBar != value) { 
       mBar = value; 
      } 
     } 
    } 

    private string mBar; 
} 

爲了使該操作可撤銷的,我們只是改變二傳手到:

set { 
    if (mBar != value) { 
     string oldValue = mBar; 
     Undoable.Do(() => mBar = value, 
        () => mBar = oldValue); 
    } 
} 

現在,如果你調用從任何地方Undoable.Undo()在應用程序中,您的實例Foo會的恢復Bar的前一個值。如果Foo在Bar變化時也引發一個事件(這裏沒有顯示),UI也會在撤消時正確刷新。