23种设计模式-23-备忘录模式

联系人对象:

/// <summary>
    /// 联系人对象
    /// </summary>
    public class Contact
    {
        public Contact(string name, string tel)
        {
            this.Name = name;
            this.Telephone = tel;
        }

        public string Name { get; set; }

        public string Telephone { get; set; }
    }

备忘录对象:

/// <summary>
    /// 备忘录对象
    /// </summary>
    public class ContactMemorandum
    {
        public ContactMemorandum(string name, List<Contact> contactList)
        {
            this.Name = name;
            this.ContactList = contactList;
            this.OperateTime = DateTime.Now;
        }

        public List<Contact> ContactList { get; set; }

        public string Name { get; set; }

        public DateTime OperateTime { get; set; }
    }

手机用户:

/// <summary>
    /// 手机用户
    /// </summary>
    public class Person
    {
        public Person(List<Contact> contactList)
        {
            this.ContactList = contactList;
        }

        /// <summary>
        /// 联系人列表
        /// </summary>
        public List<Contact> ContactList { get; set; }

        /// <summary>
        /// 备份联系人
        /// </summary>
        public ContactMemorandum CreateMemorandum(string name)
        {
            //这里一定要使用深拷贝,否则会引用对象的传递,备份就无效
            return new ContactMemorandum(name, CoreService.CloneData(this.ContactList));
        }

        /// <summary>
        /// 恢复联系人
        /// </summary>
        public void RecoveryMemorandum(ContactMemorandum memorandum)
        {
            //这里一定要使用深拷贝,否则会引用对象的传递,备份就无效
            this.ContactList = CoreService.CloneData(memorandum.ContactList);
        }

        /// <summary>
        /// 展示联系人
        /// </summary>
        public void ShowContactList()
        {
            Console.WriteLine("\t当前我的联系人列表有{0}个联系人:", this.ContactList.Count);
            int index = 0;
            foreach (var contact in ContactList)
            {
                Console.WriteLine("\t{0}.姓名:{1},联系方式:{2}", ++index, contact.Name, contact.Telephone);
            }
            Console.WriteLine("----------------------------------------------------------");
        }
    }

备忘录管理器:

/// <summary>
    /// 备忘录管理者:备份之后放在这里保管备忘录
    /// </summary>
    public class MemorandumManager
    {
        public MemorandumManager()
        {
            this.DictionaryMemorandum = new Dictionary<string, ContactMemorandum>();
        }

        public Dictionary<string, ContactMemorandum> DictionaryMemorandum { get; set; }
    }

测试:

class Program
    {
        /// <summary>
        /// 备忘录模式:
        /// 虽然说是23中设计模式中的最后一个,但也是非常简单的一个设计模式
        /// 顾名思义,就是将数据备份起来,万一我们误操作之后,以后可以恢复到指定的状态
        ///
        /// 有一点需要注意:
        /// 备忘录模式有两种恢复模式:1.单点恢复(恢复到上一次);2.多点恢复(有客户端指定,可以恢复到任意一次,只要之前备份过)
        /// 
        /// 此文中的例子:
        /// 备份通讯录,恢复通讯录
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //初始化联系人集合
            var contacts = "张三,李四,王五,赵柳,小李,小王,aaa,bbb,老板,同事"
                .Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(
                    (r, i) =>
                    {
                        string tel = string.Empty;
                        while (tel.Length < 11)
                        {
                            tel += (i + 1);
                        }
                        return new Contact(r, tel);
                    }).ToList();
            //初始化手机用户
            var person = new Person(contacts);
            //展示当前联系人信息
            Console.WriteLine("初始化手机联系人:");
            person.ShowContactList();
            //初始化备忘录对象
            var manager = new MemorandumManager();
            //备份
            Console.WriteLine("第一次备份");
            manager.DictionaryMemorandum.Add("第一次备份", person.CreateMemorandum("第一次备份"));
            //删除几个联系人
            foreach (var item in person.ContactList.FindAll(r => "张三,王五".Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Contains(r.Name)))
            {
                person.ContactList.Remove(item);
            }
            Console.WriteLine("删除两个人联系人:");
            person.ShowContactList();
            //修改几个联系人
            person.ContactList.First(r => r.Name == "小王").Name = "大王";
            person.ContactList.Add(new Contact("ccc", "123456789101"));
            //展示当前联系人
            Console.WriteLine("修改一个联系人,新增一个联系人:");
            person.ShowContactList();
            //第二次备份当前联系人
            Console.WriteLine("第二次备份");
            manager.DictionaryMemorandum.Add("第二次备份", person.CreateMemorandum("第二次备份"));
            //删除几个联系人
            foreach (var item in person.ContactList.FindAll(r => "aaa,bbb".Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Contains(r.Name)))
            {
                person.ContactList.Remove(item);
            }
            Console.WriteLine("删除两个人联系人:");
            person.ShowContactList();
            //修改几个联系人
            person.ContactList.First(r => r.Name == "ccc").Name = "zzz";
            Console.WriteLine("修改一个联系人:");
            person.ShowContactList();
            //恢复第一次的数据
            person.RecoveryMemorandum(manager.DictionaryMemorandum["第一次备份"]);
            //展示当前联系人
            Console.WriteLine("恢复第一次备份的数据:");
            person.ShowContactList();
            //恢复第二次的数据
            person.RecoveryMemorandum(manager.DictionaryMemorandum["第二次备份"]);
            //展示当前联系人
            Console.WriteLine("恢复第二次备份的数据:");
            person.ShowContactList();

            Console.ReadKey();
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值