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