备忘录模式






4.75/5 (3投票s)
备忘录设计模式是一种帮助保存对象内部状态到外部位置的模式,从而能够在需要时稍后恢复该状态。
引言
备忘录设计模式是一种帮助保存对象内部状态到外部位置的模式,从而能够在需要时稍后恢复该状态。
备忘录模式不会破坏内部状态的封装性。该模式很少使用,但在科学计算或电脑游戏中(例如保存游戏检查点)中非常有用。
备忘录模式的使用场景
您应该在以下情况下使用该模式
- 你需要保存对象的状态,并在稍后使用保存的状态来恢复该状态。
- 你不想暴露对象的内部状态。
UML 图
C# 示例
以下代码展示了如何实现该模式的示例
#region Originator
public class Originator<T>
{
#region Properties
public T State { get; set; }
#endregion
#region Methods
/// <summary>
/// Creates a new memento to hold the current
/// state
/// </summary>
/// <returns>The created memento</returns>
public Memento<T> SaveMemento()
{
return (new Memento<T>(State));
}
/// <summary>
/// Restores the state which is saved in the given memento
/// </summary>
/// <param name="memento">The given memento</param>
public void RestoreMemento(Memento<T> memento)
{
State = memento.State;
}
#endregion
}
#endregion
#region Memento
public class Memento<T>
{
#region Properties
public T State { get; private set; }
#endregion
#region Ctor
/// <summary>
/// Construct a new memento object with the
/// given state
/// </summary>
/// <param name="state">The given state</param>
public Memento(T state)
{
State = state;
}
#endregion
}
#endregion
#region Caretaker
public class Caretaker<T>
{
#region Properties
public Memento<T> Memento { get; set; }
#endregion
}
#endregion
给定的示例展示了模式的三个部分:Originator
(发起人)、Memento
(备忘录)和 Caretaker
(管理者)。
Caretaker
(管理者)是 Memento
(备忘录)的存储库。 你还可以看到,一旦创建了 Memento
(备忘录)对象,就无法更改保存的状态,并且要保存新的 Memento
(备忘录),你需要重新创建它。
让我们看一个如何在代码中使用该模式的示例
Originator<string> org = new Originator<string>();
org.State = "Old State";
// Store internal state in the caretaker object
Caretaker<string> caretaker = new Caretaker<string>();
caretaker.Memento = org.SaveMemento();
Console.WriteLine("This is the old state: {0}", org.State);
org.State = "New state";
Console.WriteLine("This is the new state: {0}", org.State);
// Restore saved state from the caretaker
org.RestoreMemento(caretaker.Memento);
Console.WriteLine("Old state was restored: {0}", org.State);
// Wait for user
Console.Read();
如你所见,保存的状态被插入到 Caretaker
(管理者)对象中,然后你可以将 Originator
(发起人)的状态更改为你需要的任何状态。
为了恢复 Originator
(发起人)的状态,你使用恢复方法,并将 Caretaker
(管理者)保存的 Memento
(备忘录)传递给它。
摘要
总结一下这篇文章,备忘录模式用于将封装的对象状态保存到外部对象中。 然后可以根据需要恢复该状态。
正如我之前所写,你想要使用该模式的地方是在科学计算或电脑游戏中,但它在其他地方也可能有所帮助。