C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】
一、引言 ???? 我们看上图,一个对象肯定会有很多状态,这些状态肯定会相互转变而促进对象的发展,如果要想在某一时刻把当前对象回复到以前某一时刻的状态,这个情况用“备忘录模式”就能很好解决该问题。 2.4、模式的组成 ?? ? ??? 可以看出,在备忘录模式的结构图有以下角色: ? ??? (1)、发起人角色(Originator):记录当前时刻的内部状态,负责创建和恢复备忘录数据。负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator【发起人】可以根据需要决定Memento【备忘录】存储自己的哪些内部状态。 ??? (2)、备忘录角色(Memento):负责存储发起人对象的内部状态,在进行恢复时提供给发起人需要的状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker【管理角色】只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator【发起人】却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。 ??? (3)、管理者角色(Caretaker):负责保存备忘录对象。负责备忘录Memento,不能对Memento的内容进行访问或者操作。 2.5、备忘录模式的代码实现 ??? 今天我们就用备份电话本的实例来说明备忘录模式的实现。实现代码如下: ? 1 namespace MementoPattern 2 { 3 // 联系人--需要备份的数据,是状态数据,没有操作 4 public sealed class ContactPerson 5 { 6 姓名 7 string Name { get; set; } 8 9 电话号码 10 string MobileNumber { 11 } 12 13 发起人--相当于【发起人角色】Originator 14 MobileBackOriginator 15 16 发起人需要保存的内部状态 17 private List<ContactPerson> _personList; 18 19 20 public List<ContactPerson> ContactPersonList 21 { 22 get 23 { 24 return this._personList; 25 } 26 27 set 28 29 this._personList = value; 30 31 } 32 初始化需要备份的电话名单 33 public MobileBackOriginator(List<ContactPerson> personList) 34 35 if (personList != null) 36 37 personList; 38 39 else 40 41 throw new ArgumentNullException("参数不能为空!"); 42 43 44 45 创建备忘录对象实例,将当期要保存的联系人列表保存到备忘录对象中 46 public ContactPersonMemento CreateMemento() 47 48 new ContactPersonMemento(new List<ContactPerson>(._personList)); 49 50 51 将备忘录中的数据备份还原到联系人列表中 52 void RestoreMemento(ContactPersonMemento memento) 53 54 this.ContactPersonList = memento.ContactPersonListBack; 55 56 57 Show() 58 59 Console.WriteLine(联系人列表中共有{0}个人,他们是:,ContactPersonList.Count); 60 foreach (ContactPerson p in ContactPersonList) 61 62 Console.WriteLine(姓名: {0} 号码: {1} 63 64 65 66 67 备忘录对象,用于保存状态数据,保存的是当时对象具体状态数据--相当于【备忘录角色】Memeto 68 ContactPersonMemento 69 70 保存发起人创建的电话名单数据,就是所谓的状态 71 public List<ContactPerson> ContactPersonListBack { private 72 73 public ContactPersonMemento(List<ContactPerson> 74 75 ContactPersonListBack = 76 77 78 79 管理角色,它可以管理【备忘录】对象,如果是保存多个【备忘录】对象,当然可以对保存的对象进行增、删等管理处理---相当于【管理者角色】Caretaker 80 MementoManager 81 82 如果想保存多个【备忘录】对象,可以通过字典或者堆栈来保存,堆栈对象可以反映保存对象的先后顺序 83 比如:public Dictionary<string,ContactPersonMemento> ContactPersonMementoDictionary { get; set; } 84 public ContactPersonMemento ContactPersonMemento { 85 86 87 Program 88 89 static void Main(string[] args) 90 91 List<ContactPerson> persons = new List<ContactPerson>() 92 93 new ContactPerson() { Name=黄飞鸿",MobileNumber = 13533332222}, 94 方世玉13966554433 95 洪熙官13198765544} 96 }; 97 98 手机名单发起人 99 MobileBackOriginator mobileOriginator = new MobileBackOriginator(persons); 100 mobileOriginator.Show(); 101 102 创建备忘录并保存备忘录对象 103 MementoManager manager = MementoManager(); 104 manager.ContactPersonMemento = mobileOriginator.CreateMemento(); 105 106 更改发起人联系人列表 107 Console.WriteLine(----移除最后一个联系人--------108 mobileOriginator.ContactPersonList.RemoveAt(2109 110 111 恢复到原始状态 112 Console.WriteLine(-------恢复联系人列表------113 mobileOriginator.RestoreMemento(manager.ContactPersonMemento); 114 115 116 Console.Read(); 117 118 119 } ????? 代码很简单,注释也很详细,不细说了。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |