Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式
在大部分游戏中,都有一个“存档点”的概念。比如,在挑战boss前,游戏会在某个地方存档,假设玩家挑战boss失败,则会从这个存档点開始又一次游戏。因此,我们能够将这个“存档点”当成是一个备忘录,我们将此时玩家全部的状态保存下来,以便之后的读取。
备忘录模式正是如此,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就能够将该对象恢复到原先的保存状态了。
一个简单的样例,如果玩家在暗黑破坏神中准备挑战Boss巴尔,玩家携带了10瓶药剂,而且在巴尔的门前“世界之石”存了档,玩家在挑战Boss时使用了1瓶药剂,后来挑战失败了,于是他又一次读档,再次回到了世界之石,此时他身上携带的药剂数量仍然应该为10瓶。
详细的代码例如以下:
interface IMemento{
}class CharacterOriginator{private int potion;private String position;public void move(String place){position = place;}public void usePotion(){potion --;}public int getPotion() {return potion;}private void setPotion(int potion) {this.potion = potion;}public String getPosition() {return position;}private void setPosition(String position) {this.position = position;}public IMemento createMemento(){return new Memento(potion, position);}public void restoreMemento(IMemento memento){setPotion(((Memento)memento).getPotion());setPosition(((Memento)memento).getPosition());}public CharacterOriginator(int potion, String position){this.potion = potion;this.position = position;}private class Memento implements IMemento{private int potion;String position;public Memento(int potion, String position){this.potion = potion;this.position = position;}public int getPotion() {return potion;}public String getPosition() {return position;}}
}class Caretaker{IMemento memento;public IMemento getMemento() {return memento;}public void setMemento(IMemento memento) {this.memento = memento;}
}class Memento
{public static void main(String[] args) {CharacterOriginator player = new CharacterOriginator(10, "世界之石");Caretaker caretaker = new Caretaker();caretaker.setMemento(player.createMemento());System.out.printf("玩家携带的药剂:%d,所在位置:%s\n", player.getPotion(), player.getPosition());player.usePotion();player.move("巴尔的宫殿");//玩家挑战失败后又一次读档System.out.printf("玩家携带的药剂:%d,所在位置:%s\n", player.getPotion(), player.getPosition());player.restoreMemento(caretaker.getMemento());System.out.printf("玩家携带的药剂:%d,所在位置:%s\n", player.getPotion(), player.getPosition());}
如今来分析一下上面的代码,并同一时候解说备忘录模式。备忘录模式有3个參与者:Originator——负责创建备忘录、还原备忘录,人物的各种状态都在此,如样例中的CharacterOriginator。Memento——备忘录,它表示须要存储哪些数据,Originator通过须要在备忘录上取数据。在上例中,Memento为Originator的一个内部类。Caretaker——负责保存、获取Memento。为了不暴露Memento的内部方法(我们觉得,Memento的内部方法仅仅能由CharacterOriginator获取),我们让Memento继承了一个空接口IMemento,因此通过Caretaker获得的备忘录均是IMemento类型的,我们无法对它做不论什么事情,可是能够把它传给CharacterOriginator,然后Originator的restoreMemento能够把IMemento类型强制转换为Memento类型。请注意,因为Memento为内部私有类,因此除了CharacterOriginator外,其余的类无法调用Memento的方法,这也就是我们说的“不暴露Memento内部方法”。restoreMemento中清晰写明了应该还原哪些状态,在这里就不进行详解了。
最后我们看看main方法。首先实例化了一个玩家(player),他有10瓶药水,位于世界之石;随后他进入了巴尔的宫殿,并用掉了一瓶药水;最后,他因为挑战失败而恢复到了曾经的存档点——拥有10瓶药水,位于世界之石。因此,程序执行的结果为:
玩家携带的药剂:10,所在位置:世界之石
玩家携带的药剂:9,所在位置:巴尔的宫殿
玩家携带的药剂:10,所在位置:世界之石
以上就是备忘录模式的说明,希望能对大家有所帮助。
转载于:https://www.cnblogs.com/gcczhongduan/p/4244592.html
Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式相关推荐
- 设计模式学习笔记——备忘录(Memento)模式
设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...
- java memento_Java备忘录(Memento)模式实现的示例代码
Java备忘录(Memento)模式实现的示例代码 /** * 数据对象 * @author stone * */ public class DataState { private String ac ...
- 用Java做手机备忘录_Java 实现备忘录(Memento)模式
/** * 数据对象 * @author stone * */ public class DataState { private String action; public void setActio ...
- Java设计模式学习以及底层源码分析
源码在分支master 工厂模式 把具体创建产品的细节封装起来,你要什么产品,我给你什么产品即可. 简单工厂模式 工厂方法模式 缓存层:抽象类 抽象工厂模式 缓存层是:接口 原型模式 问题: 原型模式 ...
- Java设计模式之观察者模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)
目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...
- Java设计模式之从[暗黑破坏神装备镶嵌宝石系统]分析桥接(Bridge)模式
暴雪公司著名的游戏暗黑破坏神中,有一个经典的"镶嵌系统",例如,可以为武器镶嵌红宝石.蓝宝石来得到攻击特效或攻击力加成,为防具镶嵌红宝石.蓝宝石来得到攻击特效或者防御力的加成.不同 ...
- java设计模式六大原则之场景应用分析
面对项目中如此众多的设计模式,我们有时候无法 下手.在强大的设计框架也终脱离不了23种设计模式,6大原则.我们只要把内功修炼好,掌握其精髓也离我们不远了... 目录: 设计模式六大原则(1):单一职责 ...
- 初学 Java 设计模式(三):实战抽象工厂方法模式 「QQ 厘米秀装扮」
一.抽象工厂方法模式介绍 1. 解决的问题 通过接口的选择,解决在系统产品存在多个产品族,而系统仅消费某一族的产品的问题. 2. 定义 抽象工厂模式是一个围绕超级工厂创建其他工厂的模式,即抽象工厂是一 ...
最新文章
- 人工智能时代,开发者是逆袭还是走向末日?
- javascript中对象在OOP方面的一些知识(主要是prototype和__proto__相关)
- 【ACL 2020】腾讯AI Lab解读三大前沿方向及入选的20篇论文
- mysql 修改配置生效_linux下面MySQL变量修改及生效
- 【深度学习】深度学习中的知识蒸馏技术(上)简介
- 解决pathForResource返回nil / 无法读取plist文件问题
- iOS NSURLCache
- 安装部署Exchange Server 2010 CAS NLB MailBox DAG
- Spring Boot 面试题
- python向lt新增5个元素_Python学习第十一课-MOOC嵩天
- RabbitMQ的基本概念
- 学java编程语言_对于零基础的人而言 该如何学Java编程语言
- 27.卷1(套接字联网API)---IP选项
- 论文笔记_S2D.57_2018-IROS_LIMO:激光雷达单目视觉里程计
- 文字处理技术:研究下划线,得到一个奇怪的数字4.55
- ISO 2768-1 标准
- 使用python将多份pdf文件合并成一份
- Pyspark 案例实践 假新闻分类
- css扁平化设计,从一个web前端开发者的角度来看扁平化设计的5大优点
- 大数据查询引擎 PrestoDB