zoukankan      html  css  js  c++  java
  • C# 设计模式-备忘录模式

    一.介绍  

      备忘录模式(Memento Pattern)。属于行为型模式。它在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

    二.实现

      备忘录顾名思义就是可以存储多个信息的工具。在该模式下,如果一个对象出现了多种状态,通过管理者的集合去存储这个对象的不同状态,之后就能够根据需要恢复各种时刻的状态。

    //备忘录(存储发起人的内部状态)
    public class Mememto
    {
        public string Text { get; set; }
    }
    
    //发起人(记录当前时刻的内部状态,恢复备忘录状态后重新记录当前状态)
    public class Originator
    {
        private string text = "";
        public void SetMememto(Mememto m)
        {
            text = m.Text;
        }
        public Mememto CreateMememto(string text)
        {
            return new Mememto { Text = text };
        }
    
        public override string ToString()
        {
            return $"text is :{text}";
        }
    }
    
    //管理角色(负责保存备忘录对象)
    public class Caretaker
    {
        private Dictionary<int, Mememto> mememtos = new Dictionary<int, Mememto>();
        public void AddMememto(Mememto m)
        {
            var count = mememtos.Count();
            mememtos.Add(++count, m);
        }
        public Mememto GetMememto(int key)
        {
            if (key > 0 && key <= mememtos.Count)
            {
                return mememtos[key];
            }
            throw new NotSupportedException();
        }
    }
    
    //调用
    public static void Main(string[] args)
    {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        for (var i = 0; i < 10; i++)
        {
            var m = originator.CreateMememto($"第{i + 1}次备忘");
            caretaker.AddMememto(m);
            Console.WriteLine($"Action {i + 1}次后:");
            Console.WriteLine(m.Text);
        }
    
        for (var i = 10; i > 0; i--)
        {
            var m = caretaker.GetMememto(i);
            originator.SetMememto(m);
            Console.WriteLine($"恢复存档{m}后:");
            Console.WriteLine(m.Text);
        }
    }

    三.总结

      优点:

      1.如果某个操作错误地破坏了对象的完整性,此时可以使用备忘录模式将对象修复成原来正确的数据。

      2.备份的状态数据保存在发起人角色之外,这个发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理人角色管理,符合单一职责原则。

      缺点:

      1.在实际的系统中,可能需要维护多份备份,需要消耗额外的资源,对性能有较大影响。

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/shadoll/p/14362060.html
Copyright © 2011-2022 走看看