c#设计模式及-行为性模式-10.备忘录模式

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#设计模式及-行为性模式-10.备忘录模式相关的知识,希望对你有一定的参考价值。

备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存该状态。等需要的时候可以将对象恢复到原先保存的状态

例子,我在看手机联系人列表,突然不小心把某个联系人删掉了,就可以用备忘录恢复联系人列表

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 备忘录模式
{
    //联系人,数据
    public sealed class ContactPerson
    {
        public string Name { get; set; }
        public string phoneNumber { get; set; }
        public ContactPerson(string name,string phone)
        {
            Name = name;
            phoneNumber = phone;
        }
    }
    //发起人
    public sealed class PhoneBackOrignator
    {
        private List<ContactPerson> personList;
        //联系人列表
        public List<ContactPerson> ContactPersonList
        {
            get { return personList; }
            set { personList = value; }
        }
        public PhoneBackOrignator(List<ContactPerson> list)
        {
            ContactPersonList = list;
        }
        //创建备忘录实例,保存联系人到备忘录中
        public ContactPersonMemento CreateMemento()
        {
            return new ContactPersonMemento(new List<ContactPerson>(this.personList));
        }
        //将备忘录数据还原到联系人列表中
        public void RestoreeMemento(ContactPersonMemento memento)
        {
            this.ContactPersonList = memento.ContactPersonListBack;
        }
        public void Show()
        {
            Console.WriteLine($"联系人列表中有{ContactPersonList.Count}个人,分别是:");
            foreach (ContactPerson p in ContactPersonList)
            {
                Console.WriteLine($"姓名:{p.Name}  号码:{p.phoneNumber}");
            }
        }
    }

    //备忘录对象
    public sealed class ContactPersonMemento
    {
        //保存发起人的电话名单数据,就是所谓的状态
        public List<ContactPerson> ContactPersonListBack { get; private set; }
        public ContactPersonMemento(List<ContactPerson> peopleList)
        {
            ContactPersonListBack = peopleList;
        }
    }
    //管理角色
    public sealed class MementoManager
    {
        //单个备忘录
        public ContactPersonMemento contactPersonMemento { get; set; }
        //多个备忘录,可使用字典或栈保存,栈可以反应对象的先后顺序
        //public Dictionary<string,ContactPersonMemento> dic { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<ContactPerson> persons = new List<ContactPerson>()
            {
                new ContactPerson("陈红","18050113021"),
                new ContactPerson("李宁","14545457485"),
                new ContactPerson("张小雨","16035021549")
            };
            //手机订单发起人,初始化联系人列表
            PhoneBackOrignator backOrignator = new PhoneBackOrignator(persons);
            backOrignator.Show();
            //创建备忘录
            MementoManager mementoManager = new MementoManager();
            mementoManager.contactPersonMemento = backOrignator.CreateMemento();
            //更改联系人列表
            Console.WriteLine("移除最后一个联系人:");
            backOrignator.ContactPersonList.RemoveAt(2);
            backOrignator.Show();
            //恢复联系人列表
            Console.WriteLine("恢复联系人列表:");
            backOrignator.RestoreeMemento(mementoManager.contactPersonMemento);
            backOrignator.Show();
            Console.ReadKey();

        }       
    }
}

联系人列表中有3个人,分别是:
姓名:陈红  号码:18050113021
姓名:李宁  号码:14545457485
姓名:张小雨  号码:16035021549
移除最后一个联系人:
联系人列表中有2个人,分别是:
姓名:陈红  号码:18050113021
姓名:李宁  号码:14545457485
恢复联系人列表:
联系人列表中有3个人,分别是:
姓名:陈红  号码:18050113021
姓名:李宁  号码:14545457485
姓名:张小雨  号码:16035021549

以上是关于c#设计模式及-行为性模式-10.备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

C#设计模式-备忘录模式

Java中23种设计模式--超快速入门及举例代码

Python 设计模式 — 行为型模式 — 备忘录模式

Python 设计模式 — 行为型模式 — 备忘录模式

JAVA SCRIPT设计模式--行为型--设计模式之Memnto备忘录模式(18)

JAVA SCRIPT设计模式--行为型--设计模式之Memnto备忘录模式(18)