undo
如何工作?每當任何值更改時,它是否會複製所有受管對象?或者它只是將實際的變化與對象受到影響的信息一起復制?這是重還是輕?撤消如何工作?
Q
撤消如何工作?
5
A
回答
2
幾乎任何支持面向對象構造的語言的「撤消」機制都使用Memento Design Pattern來實現。
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也會在撤消時正確刷新。
相關問題
- 1. tinyMCE如何撤消工作?
- 2. 如何在git中「撤消撤消」?
- 3. 如何撤消wx.grid.Grid.SetColAttr?
- 4. 如何撤消cvWarpPerspective
- 5. 如何撤消RemotingConfiguration.RegisterWellKnownServiceType()?
- 6. 如何撤消Response.Cache.SetNoStore()?
- 7. 如何撤消SetSysColors()?
- 8. HTML文本輸入撤消不工作
- 9. 撤消Pdfnup操作
- 10. 如何撤消webapp中的操作?
- 11. 如何寫撤消工作表的審覈標籤代碼
- 12. 如何在Excel插件更新工作表後「撤消」
- 13. 如何撤消提交和清理工作目錄?
- 14. Emacs如何確定要撤消的工作單元
- 15. 如何讓RichTextBox撤消更好地工作?
- 16. 撤消工作表/工作簿的Excel VBA
- 17. 如何撤消Git回滾
- 18. 如何撤消其在SQL
- 19. 如何撤消gdiplus的drawstring?
- 20. 如何撤消包更新
- 21. 如何撤消hadoop fs -rmr?
- 22. 如何撤消svn刪除
- 23. 如何撤消./configure命令
- 24. OpenGL:如何撤消縮放?
- 25. Git:如何「撤消」合併
- 26. 如何撤消Mercurial更新
- 27. 如何撤消git mixed reset?
- 28. 如何撤消git update-index?
- 29. 如何撤消「git revert head」?
- 30. 如何撤消bzr mv --auto
這不一定是正確的。紀念品可以燃燒大量的記憶。我一直在使用的應用程序通常使用Command模式,其中每個Command封裝邏輯以執行更改並將其撤消。這樣,你只會花費內存上的對象的前一個狀態和下一個狀態之間的差異。 – munificent 2010-06-11 02:38:40