意图
在不破坏封装性的前提下,捕获一个对象内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.
适用性
必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态.
构成:
1.备忘录(Memento)角色:保持原发器(Originator)的内部状态,根据原发器来决定保存哪些内部的状态.(备忘录角色就好比是一个日记本把当前发生的一些事情记录下来,当过段时间回过头来再看日记本的时候就知道在那个时刻发生了什么事情)
备忘录可以有效地利用两个接口.看管者只能调用狭窄(功能有限)的接口---它只能传递备忘录给其他对象.而原发器可以调用一个宽阔(功能强大)的接口,通过这个接口可以访问所有需要的数据,使原发器可以返回先前的状态.
2.原发器(Originator)角色:创建一个备忘录,记录它当前内部状态.可以利用一个备忘录来回复它的内部状态.
3.看管者(Caretaker)角色:只负责看管备忘录.不可以对备忘录的内容操作或检查.
ClassDiagram:
SequenceDiagram:
//公司销售记录示例 class Client { static void Main(string[] args) { Originator ori = new Originator("张三", "123456", 1000); ori.Show(); Caretaker caretaker = new Caretaker(); //保存备忘录 caretaker.Memento = ori.SaveMemento(); ori = new Originator("李四", "654321", 2000); ori.Show(); //恢复备忘录 ori.RestoreMemento(caretaker.Memento); ori.Show(); Console.ReadKey(); } } /// <summary> /// 备忘录角色 /// </summary> class Memento { private string name; private string phone; private double budget; public Memento(string name, string phone, double budget) { this.name = name; this.phone = phone; this.budget = budget; } public string Name { get { return name; } set { name = value; } } public string Phone { get { return phone; } set { phone = value; } } public double Budget { get { return budget; } set { budget = value; } } } /// <summary> /// 原发器角色 /// </summary> class Originator { private string name; private string phone; private double budget; public Originator(string name, string phone, double budget) { this.name = name; this.phone = phone; this.budget = budget; } public string Name { get { return name; } set { name = value; } } public string Phone { get { return phone; } set { phone = value; } } public double Budget { get { return budget; } set { budget = value; } } //保存备忘录 public Memento SaveMemento() { return new Memento(name, phone, budget); } //恢复备忘录 public void RestoreMemento(Memento memento) { name = memento.Name; phone = memento.Phone; budget = memento.Budget; } public void Show() { Console.WriteLine("销售期望"); Console.WriteLine("姓名: {0}", name); Console.WriteLine("电话: {0}", phone); Console.WriteLine("预算: {0}", budget); } } /// <summary> /// 看管者 /// </summary> class Caretaker { private Memento memento; internal Memento Memento { get { return memento; } set { memento = value; } } }