备忘录模式定义



代码实现

    /// <summary>/// 魔兽争霸/// </summary>public class War3{public string Race { get; set; }public string Hero { get; set; }public string Army { get; set; }public string Resource { get; set; }public void Show(){Console.WriteLine("********************************");Console.WriteLine("     Race:{0}", this.Race);Console.WriteLine("     Hero:{0}", this.Hero);Console.WriteLine("     Army:{0}", this.Army);Console.WriteLine("Resource:{0}", this.Resource);Console.WriteLine("********************************");}public void Save(string name){War3Memento memento = new War3Memento(this.Hero, this.Army, this.Resource);Caretaker.SaveWar3Memento(name, memento);}public void Load(string name){War3Memento memento = Caretaker.GetWar3Memento(name);this.Army = memento.Army;this.Hero = memento.Hero;this.Resource = memento.Resource;}}

备忘类,备忘War3中的部分属性。

    /// <summary>/// 魔兽争霸备忘/// </summary>public class War3Memento{public string Hero { get; private set; }public string Army { get; private set; }public string Resource { get; private set; }public War3Memento(string hero, string army, string resource){this.Hero = hero;this.Army = army;this.Resource = resource;}}

缓存类,使用容器进行缓存:

    /// <summary>/// 第三方保存容器:txt xml db  缓存  内存/// </summary>public class Caretaker{private static Dictionary<string, War3Memento> _War3MementoDictionary = new Dictionary<string, War3Memento>();public static void SaveWar3Memento(string name, War3Memento war3Memento){_War3MementoDictionary.Add(name, war3Memento);}public static War3Memento GetWar3Memento(string name){if (_War3MementoDictionary.ContainsKey(name))return _War3MementoDictionary[name];elsethrow new Exception("wrong name");}}

调用方代码如下:

                War3 war3 = new War3(){Race = "Undead",Hero = "Level 1 DK",Army = "5只食尸鬼",Resource = "200G 200W"};war3.Save("Start");war3.Show();Console.WriteLine("*****MF*******");war3.Hero = "3级DK1级Lich";war3.Army = "5只蜘蛛2只食尸鬼";war3.Resource = "500G 300W";war3.Save("MF");war3.Show();Console.WriteLine("*****交战*******");war3.Hero = "4级DK 3级Lich 1级小强";war3.Army = "1只憎恶6只蜘蛛1只雕像";war3.Resource = "1000G 1500W";war3.Save("交战");Console.WriteLine("*****决战*******");war3.Hero = "5级DK 4级Lich 3级小强";war3.Army = "2只憎恶8只蜘蛛2只雕像";war3.Resource = "1000G 1500W";war3.Save("决战");Console.WriteLine("*****决战后*******");war3.Hero = "6级DK 6级Lich 3级小强";war3.Army = "1只憎恶2只蜘蛛1只冰龙";war3.Resource = "10G 1200W";war3.Save("决战后");war3.Load("Start");war3.Show();war3.Load("MF");war3.Show();war3.Load("交战");war3.Show();war3.Load("决战");war3.Show();war3.Load("决战后");war3.Show();

要点总结

备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原来状态时,再从备忘录对象中进行获取,在实际开发过程也应用到这点,例如数据库中的事务处理。

备忘录模式的适用场景:
如果系统需要提供回滚操作时,使用备忘录模式非常合适。例如文本编辑器的Ctrl+Z撤销操作的实现,数据库中事务操作。

备忘录模式的优缺点
优点:
如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。
备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。

缺点:
在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。

设计模式之备忘录模式(Memento)相关推荐

  1. 二十四种设计模式:备忘录模式(Memento Pattern)

    备忘录模式(Memento Pattern) 介绍 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到保存的状态. 示例 有一个Message实体类 ...

  2. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办

    23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...

  4. 【设计模式】—— 备忘录模式Memento

    前言:[模式总览]----------by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...

  5. 设计模式-备忘录模式(Memento)-Java

    设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...

  6. 【学习笔记】设计模式-备忘录模式(Memento)

    文章目录 0 设计模式 1 备忘录模式 2 实现思路 3 需要的类 4 具体实现 4.1 Memento(备忘录) 4.2 Originator(目标对象) 4.3 CareTaker(管理者) 4. ...

  7. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少人的心弦,一段五百年都没有结 ...

  8. java备忘录模式应用场景_图解Java设计模式之备忘录模式

    图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...

  9. Alamps学习设计模式之备忘录模式(笑话:劫个色OR抢个鸡蛋版)

    //设计模式之备忘录模式(月光宝盒版),只要喊菠萝菠萝蜜,就能返回事件的原点.//至尊宝//爱你一万年 class LoverWords {// 模拟Memento     private Strin ...

  10. 设计模式之备忘录模式 转载

    https://juejin.im/post/59c8eb6951882564c5164c5f 设计模式之备忘录模式 备忘录模式 介绍 是一种行为模式 用于保存对象当前状态,并在之后恢复到此状态(后悔 ...

最新文章

  1. unity 天空盒_使用Substance in Unity搭建Unity和SP的live link实时互通环境
  2. 斯坦福Google | 面向机器人的机器学习(附63页PPT下载)
  3. 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期
  4. UILable在Autolayout模式下面自动调节字体大小
  5. 关于surface安装foxmail附件预览失效解决方案
  6. 在Golang开发中使用Redis
  7. 网络(8)-HTTP、Socket、TCP、UDP的区别和联系
  8. Eureka Server 集群
  9. 挑选大数据营销平台应注意哪些问题
  10. ios开发之--UITextField光标右移
  11. visio for android,iPad版的Visio Viewer发布:移动端也能查看Visio文档啦
  12. 软件测试人员的职业发展之路,写给那些还在迷茫的测试人
  13. c语言实训自我总结报告,C++实训总结报告
  14. SMTP 发送邮件错误码和解决方法
  15. 只允许输入数字,英文字母,符号(密码)
  16. 苹果id可以彻底注销吗_如何注销苹果id账号
  17. 什么是云主机?有什么用途?
  18. latex利用bibmap生成双语对照的文献表
  19. 锐龙r3 4100核显 r3 4100参数 r3 4100评测
  20. git-bash的alias别名设置

热门文章

  1. java中double..compare_为什么Java的Double.compare(double,double)实现了它的样子?
  2. 『GoLang』错误处理
  3. 石墨烯的精细结构研究取得进展
  4. html表白代码大全可复制,浪漫的html表白特效网页制作源代码
  5. 恢复icloud 微信无法连接服务器,从iCloud恢复,找回微信消息
  6. was cached in the local repository, resolution will not be reattempted until the update interval of
  7. 方差,标准差,协方差,样本标准差,总体标准差,抽样平均误差
  8. xss-labs靶场全通关
  9. 异数OS 星星之火(三)--异数OS-织梦师云 微服务编写入门
  10. 谷歌浏览器,添加手机模拟器