文章出處
文章列表
namespace MultipleMementoPattern { // 聯系人 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() { // 這里也應該傳遞深拷貝,new List方式傳遞的是淺拷貝, // 因為ContactPerson類中都是string類型,所以這里new list方式對ContactPerson對象執行了深拷貝 // 如果ContactPerson包括非string的引用類型就會有問題,所以這里也應該用序列化傳遞深拷貝 return new ContactMemento(new List<ContactPerson>(this.ContactPersons)); } // 將備忘錄中的數據備份導入到聯系人列表中 public void RestoreMemento(ContactMemento memento) { if (memento != null) { // 下面這種方式是錯誤的,因為這樣傳遞的是引用, // 則刪除一次可以恢復,但恢復之后再刪除的話就恢復不了. // 所以應該傳遞contactPersonBack的深拷貝,深拷貝可以使用序列化來完成 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 {get;set;} public ContactMemento(List<ContactPerson> persons) { ContactPersonBack = persons; } } // 管理角色 public class Caretaker { // 使用多個備忘錄來存儲多個備份點 public Dictionary<string, ContactMemento> ContactMementoDic { get; set; } public Caretaker() { ContactMementoDic = new Dictionary<string, ContactMemento>(); } } 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.ContactMementoDic.Add(DateTime.Now.ToString(), mobileOwner.CreateMemento()); // 更改發起人聯系人列表 Console.WriteLine("----移除最后一個聯系人--------"); mobileOwner.ContactPersons.RemoveAt(2); mobileOwner.Show(); // 創建第二個備份 Thread.Sleep(1000); caretaker.ContactMementoDic.Add(DateTime.Now.ToString(), mobileOwner.CreateMemento()); // 恢復到原始狀態 Console.WriteLine("-------恢復聯系人列表,請從以下列表選擇恢復的日期------"); var keyCollection = caretaker.ContactMementoDic.Keys; foreach (string k in keyCollection) { Console.WriteLine("Key = {0}", k); } while (true) { Console.Write("請輸入數字,按窗口的關閉鍵退出:"); int index = -1; try { index = Int32.Parse(Console.ReadLine()); } catch { Console.WriteLine("輸入的格式錯誤"); continue; } ContactMemento contactMentor = null; if (index < keyCollection.Count && caretaker.ContactMementoDic.TryGetValue(keyCollection.ElementAt(index), out contactMentor)) { mobileOwner.RestoreMemento(contactMentor); mobileOwner.Show(); } else { Console.WriteLine("輸入的索引大于集合長度!"); } } } } }
文章列表
全站熱搜