设计模式学习笔记——备忘录模式(Memento)

1.特点:不破坏封装,又要取该对象内状态,且要求状态还原时考虑。(保持封装边界)

2.概念:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

3.类图:

4.程序实现:

namespace MementoPattern
{
  // 联系人 public class ContactPerson { public string Name { get; set; } public string MobileNum { get; set; } }   // 发起人 public class MobileOwner {   // 发起人需要保存的内部状态 public List<ContactPerson> ContactPersons { get; set; } public MobileOwner(List<ContactPerson> persons) { ContactPersons = persons; }   // 创建备忘录,将当期要保存的联系人列表导入到备忘录中 public ContactMemento CreateMemento() { return new ContactMemento(new List<ContactPerson>(this.ContactPersons));
     }     // 将备忘录中的数据备份导入到联系人列表中 public void RestoreMemento(ContactMemento memento) { this.ContactPersons = memento.contactPersonBack; } public void Show() { Console.WriteLine("联系人列表中有{0}个人,他们是:", ContactPersons.Count); foreach (ContactPerson p in ContactPersons) { Console.WriteLine("姓名: {0} 号码为: {1}", p.Name, p.MobileNum); } } }   // 备忘录 public class ContactMemento {     // 保存发起人的内部状态 public List<ContactPerson> contactPersonBack; public ContactMemento(List<ContactPerson> persons) { contactPersonBack = persons; } }   // 管理角色 public class Caretaker { public ContactMemento ContactM { get; set; } } class Program { static void Main(string[] args) { List<ContactPerson> persons = new List<ContactPerson>() { new ContactPerson() { Name= "Learning Hard", MobileNum = "123445"}, new ContactPerson() { Name = "Tony", MobileNum = "234565"}, new ContactPerson() { Name = "Jock", MobileNum = "231455"} }; MobileOwner mobileOwner = new MobileOwner(persons); mobileOwner.Show();       // 创建备忘录并保存备忘录对象 Caretaker caretaker = new Caretaker(); caretaker.ContactM = mobileOwner.CreateMemento();       // 更改发起人联系人列表 Console.WriteLine("----移除最后一个联系人--------"); mobileOwner.ContactPersons.RemoveAt(2); mobileOwner.Show();       // 恢复到原始状态 Console.WriteLine("-------恢复联系人列表------"); mobileOwner.RestoreMemento(caretaker.ContactM); mobileOwner.Show(); Console.Read(); } } }

  

原文地址:https://www.cnblogs.com/ice-baili/p/4710367.html