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/

  • 相关阅读:
    【故障处理】ORA-12162: TNS:net service name is incorrectly specified (转)
    android studio 编程中用到的快捷键
    java时间格式串
    android Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
    linux安装vmware
    x1c 2017 安装mint18的坑——grub2
    x1c2017 8G版 win linux的取舍纠结记录
    python的try finally (还真不简单)
    kafka+docker+python
    json文件不能有注释
  • 原文地址:https://www.cnblogs.com/talentzemin/p/9947954.html
Copyright © 2011-2022 走看看