【问题标题】:Some explanation on memento关于纪念品的一些解释
【发布时间】:2013-10-31 16:33:26
【问题描述】:

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

【问题讨论】:

标签: c# undo memento


【解决方案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 类上加上“部分”,备忘录模式仍然完好无损。

参考:Memento Design Pattern

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多