定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
备忘录模式包括以下3个对象:
- Originator(原发器):一般将需要保存内部状态的类设计为原发器,它可以创建一个备忘录,并存储它的当前内部状态,也可以使用备忘录来恢复其内部状态。
- Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。
- Caretaker(负责人):负责人又称为管理者,它负责保存备忘录,但是不能对备忘录的内容进行操作或检查。在负责人类中可以存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象,也无须知道对象的实现细节。
举例
用户信息操作撤销
- 原发器
public class Originator
{
private String account;
private String password;public string Account { get => account; set => account = value; }
public string Password { get => password; set => password = value; }//将当前信息保存为一个备忘录
public Memento SaveMemento()
{
return new Memento(account, password);
}//用传入的备忘录中的信息替换掉当前信息
public void RestoreMemento(Memento memento)
{
this.account = memento.Account;
this.password = memento.Password;
}public void Show()
{
Console.WriteLine(account);
Console.WriteLine(password);
}
}
- 备忘录
//备忘录中的属性与原发器保持一致,同时提供get、set方法
public class Memento
{
private String account;
private String password;public string Account { get => account; set => account = value; }
public string Password { get => password; set => password = value; }public Memento(String account, String password)
{
this.account = account;
this.password = password;
}
}
- 负责人
public class Caretaker
{
private Memento memento;//获取保存的备忘录
public Memento GetMemento()
{
return memento;
}//存入新的备忘录
public void SetMemento(Memento memento)
{
this.memento = memento;
}
}
- 客户类
class Program
{
static void Main(string[] args)
{
//创建原发器和负责人
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();originator.Account = "zhangsan";
originator.Password = "122333";
originator.Show();//负责人加入原发器保存的备忘录
caretaker.SetMemento(originator.SaveMemento());
originator.Account = "lisi";
originator.Password = "666666";
originator.Show();//原发器用负责人传入的备忘录替换掉当前信息
originator.RestoreMemento(caretaker.GetMemento());
originator.Show();
}
}
总结:原发器类中。除了需要备忘录保存的属性和get、set方法外,重点是将信息保存为备忘录的方法和用传入的备忘录替换当前信息的方法,备忘录类中加入有参构造,负责人类中则创建所需要的备忘录,实现保存备忘录和获取当前备忘录的方法。