文章出處

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("輸入的索引大于集合長度!");
                }
            }     
        }
    }
}

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()