备忘录模式(Memento):
后悔药来啦!!!备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时能将该对象恢复到原先保存的状态。
备忘录模式的角色:

1)发起人(Originator):记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
2)备忘录(Memento):负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
3)管理者(CareTaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
根据上述UML图实现代码:
- 1 internal class Program
- 2 {
- 3 private static void Main(string[] args)
- 4 {
- 5 Originator o = new Originator();
- 6 o.State = "On";
- 7
- 8 Caretaker c = new Caretaker();
- 9 c.Memento = o.CreateMemento();
- 10
- 11 o.State = "Off";
- 12 o.SetMemento(c.Memento);
- 13 }
- 14 }
- 15
- 16 /// <summary>
- 17 /// 备忘录
- 18 /// </summary>
- 19 public class Memento
- 20 {
- 21 private string _state;
- 22
- 23 public Memento(string state)
- 24 {
- 25 this._state = state;
- 26 }
- 27
- 28 public string State
- 29 {
- 30 get { return _state; }
- 31 }
- 32 }
- 33
- 34 /// <summary>
- 35 /// 发起人
- 36 /// </summary>
- 37 public class Originator
- 38 {
- 39 private string _state;
- 40
- 41 public string State
- 42 {
- 43 get
- 44 {
- 45 return _state;
- 46 }
- 47 set
- 48 {
- 49 _state = value;
- 50 Console.WriteLine("State = " + _state);
- 51 }
- 52 }
- 53
- 54 public Memento CreateMemento()
- 55 {
- 56 return (new Memento(_state));
- 57 }
- 58
- 59 public void SetMemento(Memento memento)
- 60 {
- 61 Console.WriteLine("Restoring state...");
- 62 State = memento.State;
- 63 }
- 64 }
- 65
- 66 /// <summary>
- 67 /// 管理者
- 68 /// </summary>
- 69 public class Caretaker
- 70 {
- 71 private Memento _memento;
- 72
- 73 public Memento Memento
- 74 {
- 75 get
- 76 {
- 77 return _memento;
- 78 }
- 79 set
- 80 {
- 81 _memento = value;
- 82 }
- 83 }
- 84 }
现实生活中,我们往往会进行文档的备份或者SVN,git的快照。
备忘录模式的优缺点:
优点:
1)给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2)实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
备忘录模式的应用场景:
1)需要保存/恢复数据的相关状态场景。
2)提供一个可回滚的操作。
参考:https://blog.csdn.net/heyangyi_19940703/article/details/51376570