• 极速理解设计模式系列:19.备忘录模式(Memento Pattern)


    四个角色:原发器(Originator)、备忘录(Memento)、看管者(Caretaker)、客户端(Client) 

            原发器(Originator):需要备忘录来记忆其内部状态的原型。可以将本类状态保存到备忘录,也可以通过备忘录恢复状态。

            备忘录(Memento):保持原发器的内部状态,

            看管者(Caretaker):看管备忘录,不可修改备忘录。

            客户端(Client) :执行原发器保存备忘录可恢复。

    实现思路:客户端生产原发器,在原发器保存备忘录到看管者,原发器继续改变其状态,当需要时从看管者那里的备忘录获取已保存的状态以更新自身原发器状态。

    类图:

    应用场景:电话备忘保存。

    分析:某人的电话保存到备忘录时,如果需要恢复,通过保管者调用备忘录到原发器类恢复即可。

            下面我们在控制台程序去演示一下如何使用Memento Pattern:

            一、原发器(Originator):

        //Originator 原发器
    class PhoneOriginator
    {
    public string Name { get; set; }
    public string Number { get; set; }
    public PhoneMemento SaveMemento()
    {
    return new PhoneMemento(Name, Number);
    }
    public void ResumeMemento(PhoneMemento phoneMemento)
    {
    this.Name = phoneMemento.Name;
    this.Number = phoneMemento.Number;
    }
    public void Display()
    {
    Console.WriteLine("------------------");
    Console.WriteLine(Name);
    Console.WriteLine(Number);
    }
    }

            二、备忘录(Memento):

        //Memento 备忘录
    class PhoneMemento
    {
    public string Name { get; set; }
    public string Number { get; set; }
    public PhoneMemento(string name, string number)
    {
    this.Name = name;
    this.Number = number;
    }
    }

            三、看管者(Caretaker):

        //Caretaker 看管者
    class PhoneCaretaker
    {
    public PhoneMemento Memento { set; get; }
    }

            四、 客户端(Client) :

        //Client 客户端
    class Program
    {
    static void Main(string[] args)
    {
    PhoneOriginator po = new PhoneOriginator();
    po.Name = "张三";
    po.Number = "13880191995";
    po.Display();
    PhoneCaretaker pcaretaker = new PhoneCaretaker();
    pcaretaker.Memento = po.SaveMemento();

    po.Name = "李丽";
    po.Number = "13669595999";
    po.Display();

    po.ResumeMemento(pcaretaker.Memento);
    po.Display();
    Console.ReadLine();

    }
    }

           如需源码请点击 MementoPattern.rar  下载。

  • 相关阅读:
    C#.NET常见问题(FAQ)-浮点数如何四舍五入
    C#.NET常见问题(FAQ)-方法参数带ref是什么意思
    C#.NET常见问题(FAQ)-list比数组效率低多少
    C#.NET常见问题(FAQ)-如何输出带选项的MessageBox,YESNO
    微软企业库Unity学习笔记
    微软企业库5.0---缓存模块
    学习微软企业库--日志模块
    学习微软企业库存心得--总结
    C#获取网页内容,并且处理正确编码
    C#获取网页内容的三种方式
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/2246803.html
Copyright © 2020-2023  润新知