[设计]备忘录模式

来源:互联网 发布:网络不良信息举报电话 编辑:程序博客网 时间:2024/05/29 16:23

[设计]备忘录模式

场景

  • 就是想保存一个对象的内部状态,以方便切换的回来的时候,以恢复到原来的状态

解决方法

  • 可以导出一个文本文件来分门别类的存放
  • 也可以放状态保存到另一个对象中,这个对象专业的用来保存状态
  • 我们这里备忘录就是用的第二种方式,而且可以在不破坏被保存对象的内部也不破坏现有的封装。

CODE

  • 我们新建一个要保存的对象类
class Lidar    {        public string Name { get; set; }        public string DataNumber { get; set; }    }
  • 我们新建一个对象的拥有者,拥有者从名子上可以看到这个对象的权力可以用来更改对象的状态以及恢复到对象的状态
  class LidarOwner    {        public List<Lidar> LidarList { get; set; }        public LidarOwner(List<Lidar> lidars)        {            LidarList = lidars;        }        public LidarMemento CreateMemento()        {            return new LidarMemento(new List<Lidar>(LidarList));        }        public void RestoreMemento(LidarMemento memento)        {            LidarList = memento.LidarList;        }        public void Show()        {            foreach (var item in LidarList)            {                Console.WriteLine("{0},{1}",item.Name,item.DataNumber);            }        }
  • 我们创建一个备忘录类用来保存拥有者的状态的状态,所以彼此的类型肯定要一致的
  class LidarMemento    {        public List<Lidar> LidarList;        public LidarMemento(List<Lidar> lidars)        {            LidarList = lidars;        }    }
  • 之后我们可以再添加一个管理者用来管理备份的东西
 class Taker    {        public LidarMemento lidarMemento { get; set; }    }
  • 我们可以新建一个测试
 static void Main(string[] args)        {            List<Lidar> lidars = new List<Lidar>()            {                new Lidar{Name="wind",DataNumber="1"},                new Lidar{Name="temp",DataNumber="2"},                new Lidar{Name="gosail",DataNumber="3"}            };            LidarOwner lidarowner = new LidarOwner(lidars);            lidarowner.Show();            Taker lidarTaker = new Taker();            lidarTaker.lidarMemento = lidarowner.CreateMemento();            lidarowner.LidarList.RemoveAt(1);            lidarowner.Show();            lidarowner.RestoreMemento(lidarTaker.lidarMemento);            lidarowner.Show();            Console.Read();        }

类图

  • 占坑

注意

  • 就是上面的代码中备份状态的地方,创建备忘的地方我们new 如果是引用类型和值类型会有不同,我们用的是string 可以默认为是深拷贝但是值类型就不同了,大家都懂的,如果万一真不懂就百度一下吧。这是基础的知识了
  • 同样是上面的代码保存有的问题恢复的地方也有同样的问题
  • 而且上面的代码只有恢复到最近的也就是一次的状态,但是如果还想恢复到上上次的状态怎么办,这个时候大家都会注意到管理类,想一想,10S后是不是想到,我们可以用一个集合来分别保存不同时期的状态,恢复的时候大家选一个就可以了,是不是与windows还原点的特别的像,我感觉还原点内部也就是这种设计的理念。
  • 备份如是一直是深考贝会占资源是肯定的,所以一定要想清楚有没有必要备份,以及备份的管理工作。
  • 一般的系统都应该有这样一种设计,以防软件发生意外时,可以恢复到最近的最正常的状态。
    源码

-> 代码这种武功也分为内功也就是基础和技术招式也就是框架,现在的编程社会就是重招式而轻内功,一个合格的侠者肯定是内外都修。可以从招式入门,然后感受内功的深刻。少林的烧火的同样出色但是没有招式的精彩也不好,舞蹈招式很精彩,但是没有内功但支持,终久不能作用于江湖。

原创粉丝点击