在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存该状态。使得该对象可恢复到原先保存的状态。
主要组成:
Menento-备忘录,存储原发器的内部状态。
Originator-原发器,创建备忘录,用于记录内部状态
Caretaker-负责人,负责备忘录的管理
相关类:
using System.Collections.Generic;
namespace Memento
{
/// <summary>
/// 备忘录
/// </summary>
class Menento
{
public string State { get; set; }
public Menento(string state)
{
State = state;
}
}
/// <summary>
/// 原发器
/// </summary>
class Originator
{
public string State { get; set; }
//创建备忘录
public Menento CreateMenento()
{
return new Menento(State);
}
//恢复状态
public void SetMemento(Menento memento)
{
State = memento.State;
}
}
/// <summary>
/// 负责人
/// </summary>
class Caretaker
{
//编号和相应备忘录
Dictionary<int, Menento> numberAndMenentos = new Dictionary<int, Menento>();
public void AddMenentos(int number, Menento menento)
{
if (!numberAndMenentos.ContainsKey(number))
{
numberAndMenentos.Add(number, menento);
}
}
public Menento GetMenento(int number)
{
if (numberAndMenentos.ContainsKey(number))
{
return numberAndMenentos[number];
}
else
{
return null;
}
}
}
}
调用:
using System;
namespace Memento
{
class Program
{
static void Main(string[] args)
{
//负责人
Caretaker caretaker = new Caretaker();
Originator fileOriginator = new Originator();
fileOriginator.State = "状态1";
//创建备忘录
Menento menento1 = fileOriginator.CreateMenento();
caretaker.AddMenentos(1, menento1);
fileOriginator.State = "状态2";
//创建备忘录
Menento menento2 = fileOriginator.CreateMenento();
caretaker.AddMenentos(2, menento2);
Console.WriteLine("当前状态:{0}", fileOriginator.State);
//恢复状态
fileOriginator.SetMemento(caretaker.GetMenento(1));
Console.WriteLine("恢复到:{0}",fileOriginator.State);
//恢复状态
fileOriginator.SetMemento(caretaker.GetMenento(2));
Console.WriteLine("恢复到:{0}",fileOriginator.State);
Console.Read();
}
}
}
结果:
参考资料:《设计模式-可复用面对对象软件的基础》