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.在实际的系统中,可能需要维护多份备份,需要消耗额外的资源,对性能有较大影响。

  • 相关阅读:
    用智慧明辨之
    做一个成功的软件架构师需要哪些素质?
    如何成为一名优秀的产品经理
    项目管理中的冲突管理
    .Net 缓存依赖详解
    从程序制作到构架制作
    如何做好一名软件团队的领导者
    需求变更的代价
    页面缓存的实现
    项目风险盘点
  • 原文地址:https://www.cnblogs.com/shadoll/p/14362060.html
Copyright © 2011-2022 走看看