[英]Some explanation on memento
我檢查了所有地方,並閱讀了無數篇文章。 我什至在一些中文論壇上尋找答案。 問題是我無法完全理解c#記憶模式。 不同的文章顯示了執行此操作的不同方法,我無法正確理解。 大多數文章僅顯示簡單的內容,例如字符串紀念品。 我試圖了解如何執行撤消功能並需要幫助,並且如何在公共局部類上執行撤消功能呢?我只需要一個小示例來展示公共局部類紀念品。 提前致謝。
基本上,紀念品是一種保存和恢復對象狀態的方法。 但這還不止於此:它是一種保留封裝的方法。 因此,如果要保存其狀態的對象具有一些私有成員,則記憶模式是一種能夠以有限的方式訪問這些成員的方式。
例如,假設我們有一個2D角色在地圖上醉酒漫步:
public class Sprite
{
private double _x = 0, _y = 0;
public void Run()
{
var random = new byte[2];
new Random().NextBytes(random);
_x += (double)random[0];
_y += (double)random[1];
}
public void Render()
{
Console.WriteLine("({0}, {1})", _x, _y);
}
}
假設我們不想將x和y公開為公共成員,但是我們希望能夠保存對象的狀態。 然后,我們可以創建一個memento類來封裝對象的狀態:
public class SpriteMemento
{
public double X { get; set; }
public double Y { get; set; }
}
Sprite類可以接受一個memento對象以恢復其狀態,並提供一個對象來保存:
public class Sprite
{
// ...
public SpriteMemento Memento
{
get { return new SpriteMemento { X = _x, Y = _y }; }
}
public void Restore(SpriteMemento memento)
{
if (memento == null)
return;
_x = memento.X;
_y = memento.Y;
}
}
現在,假設我們有另一個控制運行的類。 現在,我們可以讓此類提供“撤消”功能:
static void Main(string[] args)
{
var sprite = new Sprite();
SpriteMemento state = null;
while (true)
{
string input = Console.ReadLine();
if (input == "run")
sprite.Run();
else if (input == "save")
state = sprite.Memento;
else if (input == "undo")
sprite.Restore(state);
sprite.Render();
}
}
至於部分類,實際上沒有什么區別,只是將“部分”添加到上面的Sprite類,而記憶模式仍然是完整的。
參考: Memento設計模式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.