簡體   English   中英

關於紀念品的一些解釋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM