0

我已经检查了每一个地方,并且阅读了无数的文章。我什至去一些中文论坛寻找答案。问题是我无法完全理解 c# memento 模式。不同的文章显示了不同的方法,我无法正确理解。大多数文章只显示简单的东西,如字符串纪念品。我正在尝试了解如何执行撤消功能并需要帮助,以及如何在公共部分类上执行撤消功能?我只需要一个显示公共部分类纪念品的小示例。提前致谢。

4

1 回答 1

1

基本上,纪念品是一种保存和恢复对象状态的方法。但它超越了这一点:它是一种保留封装的方式。因此,如果您要保存其状态的对象具有一些私有成员,则备忘录模式是一种能够以有限的方式访问这些成员的方式。

例如,假设我们有一个 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 公开为公共成员,但我们希望能够保存对象的状态。然后我们可以创建一个封装对象状态的备忘录类:

public class SpriteMemento
{
    public double X { get; set; }
    public double Y { get; set; }
}

Sprite 类可以接受一个备忘录对象来恢复其状态,并提供一个来保存:

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 类,备忘录模式仍然完好无损。

参考:备忘录设计模式

于 2013-10-22T17:28:02.807 回答