zoukankan      html  css  js  c++  java
  • 设计模式(17)备忘录模式

    模式介绍

    备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

    示例

    想象一下,一家真正高端的餐厅可能直接从当地农场订购,并且餐厅需要跟踪哪些配料来自哪些供应商。
    在我们的系统中,我们需要跟踪关于特定供应商输入的信息量,并且如果我们意外地输入了错误的地址,就能够将信息恢复到以前的状态。

    /// <summary>
    /// The Originator class, which is the class for which we want to save Mementos for its state.
    /// </summary>
    class FoodSupplier
    {
        private string _name;
        private string _phone;
        private string _address;
    
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                Console.WriteLine("Proprietor:  " + _name);
            }
        }
    
        public string Phone
        {
            get { return _phone; }
            set
            {
                _phone = value;
                Console.WriteLine("Phone Number: " + _phone);
            }
        }
    
        public string Address
        {
            get { return _address; }
            set
            {
                _address = value;
                Console.WriteLine("Address: " + _address);
            }
        }
    
        public FoodSupplierMemento SaveMemento()
        {
            Console.WriteLine("
    Saving current state
    ");
            return new FoodSupplierMemento(_name, _phone, _address);
        }
    
        public void RestoreMemento(FoodSupplierMemento memento)
        {
            Console.WriteLine("
    Restoring previous state
    ");
            Name = memento.Name;
            Phone = memento.PhoneNumber;
            Address = memento.Address;
        }
    }
    

    备忘录类:

    /// <summary>
    /// The Memento class
    /// </summary>
    class FoodSupplierMemento
    {
        public string Name { get; set; }
        public string PhoneNumber { get; set; }
        public string Address { get; set; }
    
        public FoodSupplierMemento(string name, string phone, string address)
        {
            Name = name;
            PhoneNumber = phone;
            Address = address;
        }
    }
    

    守护者类:

    /// <summary>
    /// The Caretaker class.  This class never examines the contents of any Memento and is
    /// responsible for keeping that memento.
    /// </summary>
    class SupplierMemory
    {
        private FoodSupplierMemento _memento;
    
        public FoodSupplierMemento Memento
        {
            set { _memento = value; }
            get { return _memento; }
        }
    }
    

    客户端调用:

    static void Main(string[] args)
    {
        //Here's a new supplier for our restaurant
        FoodSupplier s = new FoodSupplier();
        s.Name = "Harold Karstark";
        s.Phone = "(482) 555-1172";
    
        // Let's store that entry in our database.
        SupplierMemory m = new SupplierMemory();
        m.Memento = s.SaveMemento();
    
        // Continue changing originator
        s.Address = "548 S Main St. Nowhere, KS";
    
        // Crap, gotta undo that entry, I entered the wrong address
        s.RestoreMemento(m.Memento);
    
        Console.ReadKey();
    }
    

    总结

    备忘录模式试图将对象的状态封装为另一个对象(称为Memento),并允许从该Memento恢复对象的状态。

    源代码

    https://github.com/exceptionnotfound/DesignPatterns/tree/master/Memento

    原文

    https://www.exceptionnotfound.net/the-daily-design-pattern-memento/

  • 相关阅读:
    利用Libra进行机器学习和深度学习
    生产中的ML-1:Amazon Sagemaker-AWS,设置,训练和部署
    PANDAS: 新手教程 一
    dblink连接操作远程数据库
    Tomcat设置开机自动启动
    DataRow[] 转为数组
    C#子线程刷新界面并关闭窗体
    SQL SERVER 生成建表脚本
    SQL SERVER 生成MYSQL建表脚本
    SQL SERVER 生成ORACLE建表脚本
  • 原文地址:https://www.cnblogs.com/talentzemin/p/9947954.html
Copyright © 2011-2022 走看看