一天一个设计模式---备忘录模式
介绍:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。
场景:我们在平时玩单机游戏的时候,比如红白机的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
一天一个设计模式---备忘录模式相关推荐
- Python设计模式-备忘录模式
Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
- Java设计模式——备忘录模式
Java设计模式--备忘录模式 需求 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状 ...
- 设计模式-备忘录模式(Memento)-Java
设计模式-备忘录模式(Memento)-Java 目录 文章目录 1.前言 2.示例案例-可悔棋的中国象棋 3.备忘录模式概述 3.1.备忘录模式定义 3.2.备忘录模式结构 3.3.备忘录模式结构图 ...
- C++设计模式——备忘录模式(memento pattern)
博主看了许多文章和一些书,发现要么代码不全,要么对备忘录的理解有偏差,要么干脆根本就不是备忘录模式,经过博主查阅十余篇文章和详细研究书本备忘录模式,总结出这篇精华的c++备忘录模式文章,感兴趣的朋友可 ...
- java设计模式---备忘录模式
一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...
- 大话设计模式—备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保 ...
- PHP设计模式——备忘录模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...
- golang设计模式——备忘录模式
备忘录模式 当初学备忘录模式的时候,特别开心.这不就是游戏里的备份嘛!游戏关闭之后,重新开启,从上次结束的位置继续开始.但终归没有进入游戏行业,也没有机会用过备忘录模式. 备忘录模式:在不破坏封装性的 ...
最新文章
- Linux内核网络栈1.2.13-有关tcp/ip协议的基础入门
- 1370亿参数、接近人类水平,谷歌重磅推出对话AI模型LaMDA
- android 如何去掉自定义标签页,Android中为TextView增加自定义的HTML标签
- LeetCode 496. 下一个更大元素 I 解题思路及C++实现
- npm run dev 出现npm ERR!missing scrip:dev
- Caffe学习笔记2
- mysql主从同步简单原理_MYSQL简单主从复制原理及实现
- 可视化神器背后的奥秘
- 什么叫返回路径平面上的间隙_差分信号回流路径的全波电磁场解析
- Linux常用的基本命令14
- ubuntu12.04 安装kinect V1驱动
- 【Java开发规范】Float,Double,BigDecimal 精度使用注意事项
- php魔法函数用途,PHP中的Magic Methods (魔术函数)
- unix grep命令_Linux / UNIX中的Grep命令
- 【Dairy】2016.11.5
- 原装苹果手机_苹果手机换个屏水这么深!嘉兴警方揭开“原装屏”真相
- 北京个体户税务申报如何办理?
- Caffe2 Synchronous SGD
- 集算器协助SQL实现非等值分组
- 观点:灵魂绑定NFT和去中心化社会