C# 设计模式-备忘录模式
一.介绍
备忘录模式(Memento Pattern)。属于行为型模式。它在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
二.实现
备忘录顾名思义就是可以存储多个信息的工具。在该模式下,如果一个对象出现了多种状态,通过管理者的集合去存储这个对象的不同状态,之后就能够根据需要恢复各种时刻的状态。
//备忘录(存储发起人的内部状态) public class Mememto { public string Text { get; set; } } //发起人(记录当前时刻的内部状态,恢复备忘录状态后重新记录当前状态) public class Originator { private string text = ""; public void SetMememto(Mememto m) { text = m.Text; } public Mememto CreateMememto(string text) { return new Mememto { Text = text }; } public override string ToString() { return $"text is :{text}"; } } //管理角色(负责保存备忘录对象) public class Caretaker { private Dictionary<int, Mememto> mememtos = new Dictionary<int, Mememto>(); public void AddMememto(Mememto m) { var count = mememtos.Count(); mememtos.Add(++count, m); } public Mememto GetMememto(int key) { if (key > 0 && key <= mememtos.Count) { return mememtos[key]; } throw new NotSupportedException(); } } //调用 public static void Main(string[] args) { Originator originator = new Originator(); Caretaker caretaker = new Caretaker(); for (var i = 0; i < 10; i++) { var m = originator.CreateMememto($"第{i + 1}次备忘"); caretaker.AddMememto(m); Console.WriteLine($"Action {i + 1}次后:"); Console.WriteLine(m.Text); } for (var i = 10; i > 0; i--) { var m = caretaker.GetMememto(i); originator.SetMememto(m); Console.WriteLine($"恢复存档{m}后:"); Console.WriteLine(m.Text); } }
三.总结
优点:
1.如果某个操作错误地破坏了对象的完整性,此时可以使用备忘录模式将对象修复成原来正确的数据。
2.备份的状态数据保存在发起人角色之外,这个发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理人角色管理,符合单一职责原则。
缺点:
1.在实际的系统中,可能需要维护多份备份,需要消耗额外的资源,对性能有较大影响。