备忘录模式(Memento Pattern)是一种行为设计模式,其目的是在不破坏对象封装性的前提下,捕获并外部保存对象的状态,并在日后将该对象状态恢复到之前的某个状态。
备忘录模式包括三个角色:
- Originator:原发器,创建需要存储的备忘录对象,以保存对象的状态。
- Memento:备忘录,保存原发器状态的对象。
- Caretaker:管理者,负责保存和恢复备忘录。在没有访问备忘录内部状态的前提下负责保护备忘录。
以下是一个使用C#编写的备忘录模式的经典代码实例。实例中,我们使用备忘录模式记录一个数字的历史状态,并支持撤销到之前的某个状态。
代码语言:javascript复制// 备忘录类,用于保存数字状态
public class NumberMemento
{
private int _value;
public NumberMemento(int value)
{
_value = value;
}
public int GetValue()
{
return _value;
}
}
// 原发器类,用于创建备忘录和恢复备忘录
public class Number
{
private int _value;
public int GetValue()
{
return _value;
}
public void SetValue(int value)
{
_value = value;
}
// 创建备忘录
public NumberMemento Save()
{
return new NumberMemento(_value);
}
// 恢复备忘录
public void Restore(NumberMemento memento)
{
_value = memento.GetValue();
}
}
// 管理者类,用于保存和恢复备忘录
public class History
{
private Stack<NumberMemento> _mementos = new Stack<NumberMemento>();
public void PushMemento(NumberMemento memento)
{
_mementos.Push(memento);
}
public NumberMemento PopMemento()
{
return _mementos.Pop();
}
}
// 示例代码
var number = new Number();
var history = new History();
number.SetValue(10);
history.PushMemento(number.Save());
number.SetValue(20);
history.PushMemento(number.Save());
number.SetValue(30);
// 当前值为30
Console.WriteLine($"Current value: {number.GetValue()}");
// 撤销到前一步,值为20
number.Restore(history.PopMemento());
Console.WriteLine($"Current value: {number.GetValue()}");
// 撤销到再前一步,值为10
number.Restore(history.PopMemento());
Console.WriteLine($"Current value: {number.GetValue()}");
输出:
代码语言:javascript复制Current value: 30
Current value: 20
Current value: 10
【代码分析】
在这个示例中,我们使用Number
类表示一个数字,并且使用NumberMemento
类表示数字的备忘录。History
类则表示备忘录的管理者,包含一个Stack
用于保存备忘录对象。通过这个例子,我们可以看到如何使用备忘录模式来记录对象的历史状态,并支持恢复到之前的某个状态。