https://juejin.im/post/59c8eb6951882564c5164c5f

设计模式之备忘录模式

备忘录模式

介绍

  • 是一种行为模式
  • 用于保存对象当前状态,并在之后恢复到此状态(后悔药)
  • 需要保证被保存的对象状态不能被外部访问,保证内部完整性,不向外透露

定义

  • 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便恢复到原先保存的状态

使用场景

  • 需要保存一个对象在某一个时刻的状态或者部分状态

  • 如果用一个接口来让其他对象的到这些状态,将会暴露这个对象的实现细节并破坏对象的的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态

UML

说明

  1. Originator:负责创建一个备忘录,可以记录、恢复自身的内部状态。同事还可以根据需要决定Memento存储自身的那些状态

  2. Mement:备忘录角色,用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento

  3. Caretaker: 负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象

简单实现

1.备忘录类,用于记录游戏需要记录的详细信息

    /*** 备忘录类*/public class Memoto {public int mCheckpoint;public int mLifeValue;public String mWeapon;@Overridepublic String toString() {return "Memoto [mCheckpoint="+mCheckpoint+" mLifeValue"+mLifeValue+" mWeapon"+mWeapon+"]";}}复制代码

2.创建游戏类(Originator),实现游戏基本逻辑,其内部可以实现备忘录的创建以及获取,但是不实现存储以及恢复的逻辑

    /** 使命召唤游戏演戏(Originator)*/public class CallOfDuty {private int mCheckpoint = 1;private int mLifeValue = 100;private String mWeapon = "沙漠之鹰";public void play(){System.out.println("打游戏:" + String.format("第%d关", mCheckpoint) + "奋战杀敌中");mLifeValue -=10;System.out.println("进度升级了");mCheckpoint++;System.out.println("到达"+String.format("第%d关", mCheckpoint));}public void quit(){System.out.println("---------------------");System.out.println("退出前的属性:"+this.toString());System.out.println("退出游戏");System.out.println("---------------------");}//创建备忘录public Memoto createMemoto(){Memoto memoto = new Memoto();memoto.mCheckpoint = mCheckpoint;memoto.mLifeValue = mLifeValue;memoto.mWeapon = mWeapon;return memoto;}public void restore(Memoto memoto){this.mCheckpoint = memoto.mCheckpoint;this.mLifeValue = memoto.mLifeValue;this.mWeapon = memoto.mWeapon;System.out.println("恢复后的游戏属性:"+this.toString());}@Overridepublic String toString() {return "CallOfDuty [mCheckpoint="+mCheckpoint+" mLifeValue"+mLifeValue+" mWeapon"+mWeapon+"]";}}复制代码

3.Caretaker类的创建,实现游戏进度的存档以及恢复逻辑,但是不对实际的游戏数据进行操作

    /*** 负责管理Memoto*/public class Caretaker {//备忘录Memoto memoto;//存档public void archive(Memoto memoto){this.memoto = memoto;}//获取存档public Memoto getMemoto(){return memoto;}}复制代码

4.Main函数的实现

    public class Main {public static void main(String[] args) {//构建游戏对象CallOfDuty callOfDuty = new CallOfDuty();//开始游戏callOfDuty.play();//构建caretaker,用于游戏存档Caretaker caretaker = new Caretaker();//通过游戏本身创建备忘录,caretaker执行存档操作caretaker.archive(callOfDuty.createMemoto());//退出游戏callOfDuty.quit();//重新开启游戏,并通过caretaker恢复游戏进度CallOfDuty callOfDuty1 = new CallOfDuty();callOfDuty1.restore(caretaker.getMemoto());}}复制代码

5.运行结果

    打游戏:第1关奋战杀敌中进度升级了到达第2关---------------------退出前的属性:CallOfDuty [mCheckpoint=2 mLifeValue90 mWeapon沙漠之鹰]退出游戏---------------------恢复后的游戏属性:CallOfDuty [mCheckpoint=2 mLifeValue90 mWeapon沙漠之鹰]复制代码
  • 总结:CallOfDuty在这里是Origintor角色,也就是需要存储数据的对象,这里并没有直接存储CallOfDuty对象,而是通过Memoto对CallOfDuty对象的数据进行存储,然后在存储Memoto对象,最终对Memoto对象的存取操作交给Caretaker对象。在整个过程中,对外屏蔽了对CallOfDuty角色的直接访问,满足对象状态存取功能的同时也是的该模块的结构保持清晰、整洁。

设计模式之备忘录模式 转载相关推荐

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

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

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

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

  3. java之备忘录模式,java设计模式之备忘录模式

    java设计模式之备忘录模式 代码无错便是优? 简介: 在不破坏封装性的前提下 , 捕获一个对象的内部状态,并在该对象之外保存这个状态 , 这样以后就可以将该对象恢复到原先保存的状态 . 备忘录模式就 ...

  4. java备忘录模式 类图,Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时 ...

  5. [转]深入浅出Java设计模式之备忘录模式

    本文转自:http://dev.yesky.com/450/2070450.shtml 一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛 ...

  6. Head First设计模式之备忘录模式

    一.定义 不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样就可以将该对象恢复到原先保存的状态 二.结构 备忘录模式中主要有三类角色: 发起人角色:记录当前时刻的内部状态, ...

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

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

  8. 【设计模式】备忘录模式(以电影明日边缘为例)

    1.说明 备忘录(Memento): 在不破坏封装性的前提下,捕获一个对象的内部装填,并在对象之外保存这个状态. 这样以后就可以将该对象恢复到原先保存的状态. 三个要素:[发起者] [备忘录] [管理 ...

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

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

最新文章

  1. java开闭原则 例子_解析Java编程中设计模式的开闭原则的运用
  2. mycncart操作使用教程 - 商品分类
  3. 征稿 | Big Data Research 专刊(影响因子 2.95)
  4. snmp 获得硬件信息_计算机网络基础课程—简单网络管理协议(SNMP)
  5. php strstr 从尾部,PHP strstr() 和 strrchr() 详解
  6. swiftui 跳转_酷!苹果推出 SwiftUI,提高编程效率
  7. 冷热分离和直接使用大数据库_智能冷热分离的思考-内存数据库
  8. supermap iserver端口介绍
  9. 微信公开课讲师黄咪咪:熟读规则,玩转小游戏
  10. MyBatis 【返回自增id】
  11. opencv-4.5.5-vc14_vc15配置环境VC++
  12. hadoop-hive安装
  13. 考研题目 第二章线性表
  14. team viewer如何解绑设备
  15. TYVJ-P1035 棋盘覆盖
  16. win10安装并配置node.js
  17. OpenGL ES 3. 天空盒 立方体贴图
  18. win7耳机插前面没声音_【电脑】第8期分享:电脑没声音怎么去解决?
  19. 民族企业夯实科技能力 助力数字经济高质量发展
  20. 一文讲透肿瘤微生物组研究怎么做

热门文章

  1. iOS自定义backBarButtonItem的点击事件
  2. 将一个整数字符串转换为一个整数,如“-1234”转化为-1234
  3. 流媒体专家(3)rtsp内嵌的会话描述协议sdp
  4. 财经365独家调查|梦、谎言、电子烟,陕西金叶如何误炼成妖股
  5. 【VR】(三)Unity3D中开发VR程序的流程
  6. [linux]四、详解vim编辑器(超详细)
  7. windows FAT32文件系统手动数据恢复
  8. shell脚本 数组
  9. JAVAEE千锋教育第一天学习总结(2022年7月11日)
  10. cocos2d-x 3.6版连连看载入资源