介绍:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。

场景:我们在平时玩单机游戏的时候,比如红白机的Pokemon–宠物小精灵,卡boss的时候我们常常会用,SL(存/读)大法,这里的存盘读盘就和备忘录模式很相似。

适用:

  • 需要保存一对象在某一时刻的状态,方便在之后需要时恢复到先前状态
  • 如果用一个接口来让其他对象直接得到这些状态,会暴露对象实现的细节并破坏对象的封装性

一、角色及作用

角色 作用
发起人 被备份的对象,提供备忘录创建的方法,可以根据需求决定备份的内容。
备忘录 用于存储发起人的内部状态
看管者 管理备忘录,不对备忘录进行修改,而是将它们传递到不同对象

二、宠物小精灵的世界

发起人:宠物小精灵游戏

public class Pokemon {private String[] defaultSp = new String[10];private List<String> playerSp = new ArrayList<String>();public void play() {int rsp = (int) (Math.random() * 10); // 随机出现精灵System.out.println("在野外遇到了" + defaultSp[rsp]);int rch = (int) (Math.random() * 100); // 捕获几率if (rch > 40) { // 成功捕获的System.out.println("成功捕获" + defaultSp[rsp]);playerSp.add(defaultSp[rsp]);} else {System.out.println("抓捕失败" + defaultSp[rsp] + "逃走了");}System.out.println("======");}/*** 创建备忘录*/public Memento createMemento() {Memento memento = new Memento();List<String> copy = new ArrayList<String>();copy.addAll(playerSp); // 由于list非基本数据类型,需要进行拷贝memento.playerSp = copy;return memento;}/*** 恢复游戏*/public void restore(Memento memento) {this.playerSp = memento.playerSp;}/*** 展示当前拥有的精灵*/public void show() {System.out.println("您当前拥有:");for (int i = 0; i < playerSp.size(); i++) {System.out.println(playerSp.get(i));}System.out.println("=====");}{ // 初始化defaultSp[0] = "皮卡丘";defaultSp[1] = "小拳石";defaultSp[2] = "瓦斯弹";defaultSp[3] = "暴鲤龙";defaultSp[4] = "小火龙";defaultSp[5] = "妙蛙种子";defaultSp[6] = "水箭龟";defaultSp[7] = "超梦";defaultSp[8] = "梦幻";defaultSp[9] = "喵喵";}}

备忘录:存档

public class Memento {public List<String> playerSp = new ArrayList<String>();
}

管理者

public class Caretaker {private Memento memento; // 管理的备忘录// 存档public void save(Memento memento) {this.memento = memento;}public Memento load() {return memento;}
}

三、打不过怎么办?SL大法

Pokemon pk = new Pokemon();
// 玩游戏
pk.play();
pk.play();
pk.show();// 存盘
System.out.println("存盘");
Caretaker ck = new Caretaker();
ck.save(pk.createMemento());// 继续玩
pk.play();
pk.play();
pk.show();// 打不过了,读盘
System.out.println("读盘");
pk.restore(ck.load());pk.show();

输出

在野外遇到了皮卡丘
抓捕失败皮卡丘逃走了
======
在野外遇到了暴鲤龙
成功捕获暴鲤龙
======
您当前拥有:
暴鲤龙
=====
存盘
在野外遇到了喵喵
成功捕获喵喵
======
在野外遇到了喵喵
抓捕失败喵喵逃走了
======
您当前拥有:
暴鲤龙
喵喵
=====
读盘
您当前拥有:
暴鲤龙
=====

总结:备忘录为用户提供了一种存储的副本,用于数据恢复,而且在保存时用户无需关系保存的内容。


更多模式:一天一个设计模式—分类与六大原则

更多源码: https://github.com/oDevilo/Java-Base

一天一个设计模式---备忘录模式相关推荐

  1. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  2. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  3. Java设计模式——备忘录模式

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

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

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

  5. C++设计模式——备忘录模式(memento pattern)

    博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...

  6. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  7. 大话设计模式—备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保 ...

  8. PHP设计模式——备忘录模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...

  9. golang设计模式——备忘录模式

    备忘录模式 当初学备忘录模式的时候,特别开心.这不就是游戏里的备份嘛!游戏关闭之后,重新开启,从上次结束的位置继续开始.但终归没有进入游戏行业,也没有机会用过备忘录模式. 备忘录模式:在不破坏封装性的 ...

最新文章

  1. Linux内核网络栈1.2.13-有关tcp/ip协议的基础入门
  2. 1370亿参数、接近人类水平,谷歌重磅推出对话AI模型LaMDA
  3. android 如何去掉自定义标签页,Android中为TextView增加自定义的HTML标签
  4. LeetCode 496. 下一个更大元素 I 解题思路及C++实现
  5. npm run dev 出现npm ERR!missing scrip:dev
  6. Caffe学习笔记2
  7. mysql主从同步简单原理_MYSQL简单主从复制原理及实现
  8. 可视化神器背后的奥秘
  9. 什么叫返回路径平面上的间隙_差分信号回流路径的全波电磁场解析
  10. Linux常用的基本命令14
  11. ubuntu12.04 安装kinect V1驱动
  12. 【Java开发规范】Float,Double,BigDecimal 精度使用注意事项
  13. php魔法函数用途,PHP中的Magic Methods (魔术函数)
  14. unix grep命令_Linux / UNIX中的Grep命令
  15. 【Dairy】2016.11.5
  16. 原装苹果手机_苹果手机换个屏水这么深!嘉兴警方揭开“原装屏”真相
  17. 北京个体户税务申报如何办理?
  18. Caffe2 Synchronous SGD
  19. 集算器协助SQL实现非等值分组
  20. 观点:灵魂绑定NFT和去中心化社会

热门文章

  1. 最小费用流算法不完全指南-2017华为软件精英挑战赛
  2. 2D 动画调整 position 产生的位移问题
  3. Java解压压缩加密文件zip
  4. ipad分屏功能怎么用_QQ音乐的听歌识曲功能怎么用?
  5. Netlink的简单例子
  6. 2021年保育员(中级)考试题及保育员(中级)考试报名
  7. slice,splice,split的区别,一开就懂
  8. java ews_Java---使用EWS读取exchange邮件
  9. EWS Java API 的基本使用
  10. Microbiome 专刊征稿