在大部分游戏中,都有一个“存档点”的概念。比如,在挑战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)模式相关推荐

  1. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  2. java memento_Java备忘录(Memento)模式实现的示例代码

    Java备忘录(Memento)模式实现的示例代码 /** * 数据对象 * @author stone * */ public class DataState { private String ac ...

  3. 用Java做手机备忘录_Java 实现备忘录(Memento)模式

    /** * 数据对象 * @author stone * */ public class DataState { private String action; public void setActio ...

  4. Java设计模式学习以及底层源码分析

    源码在分支master 工厂模式 把具体创建产品的细节封装起来,你要什么产品,我给你什么产品即可. 简单工厂模式 工厂方法模式 缓存层:抽象类 抽象工厂模式 缓存层是:接口 原型模式 问题: 原型模式 ...

  5. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. Java设计模式(方法工厂类、单例模式、代理模式、策略模式、适配器、观察者、装饰类等)

    目录 一.简单工厂模式(Factory Method) 二.工厂方法模式 三.抽象工厂模式(Abstract Factory) 3.1 三个工厂模式区别: 四.单例模式(Singleton) 1.饿汉 ...

  7. Java设计模式之从[暗黑破坏神装备镶嵌宝石系统]分析桥接(Bridge)模式

    暴雪公司著名的游戏暗黑破坏神中,有一个经典的"镶嵌系统",例如,可以为武器镶嵌红宝石.蓝宝石来得到攻击特效或攻击力加成,为防具镶嵌红宝石.蓝宝石来得到攻击特效或者防御力的加成.不同 ...

  8. java设计模式六大原则之场景应用分析

    面对项目中如此众多的设计模式,我们有时候无法 下手.在强大的设计框架也终脱离不了23种设计模式,6大原则.我们只要把内功修炼好,掌握其精髓也离我们不远了... 目录: 设计模式六大原则(1):单一职责 ...

  9. 初学 Java 设计模式(三):实战抽象工厂方法模式 「QQ 厘米秀装扮」

    一.抽象工厂方法模式介绍 1. 解决的问题 通过接口的选择,解决在系统产品存在多个产品族,而系统仅消费某一族的产品的问题. 2. 定义 抽象工厂模式是一个围绕超级工厂创建其他工厂的模式,即抽象工厂是一 ...

最新文章

  1. 人工智能时代,开发者是逆袭还是走向末日?
  2. javascript中对象在OOP方面的一些知识(主要是prototype和__proto__相关)
  3. 【ACL 2020】腾讯AI Lab解读三大前沿方向及入选的20篇论文
  4. mysql 修改配置生效_linux下面MySQL变量修改及生效
  5. 【深度学习】深度学习中的知识蒸馏技术(上)简介
  6. 解决pathForResource返回nil / 无法读取plist文件问题
  7. iOS NSURLCache
  8. 安装部署Exchange Server 2010 CAS NLB MailBox DAG
  9. Spring Boot 面试题
  10. python向lt新增5个元素_Python学习第十一课-MOOC嵩天
  11. RabbitMQ的基本概念
  12. 学java编程语言_对于零基础的人而言 该如何学Java编程语言
  13. 27.卷1(套接字联网API)---IP选项
  14. 论文笔记_S2D.57_2018-IROS_LIMO:激光雷达单目视觉里程计
  15. 文字处理技术:研究下划线,得到一个奇怪的数字4.55
  16. ISO 2768-1 标准
  17. 使用python将多份pdf文件合并成一份
  18. Pyspark 案例实践 假新闻分类
  19. css扁平化设计,从一个web前端开发者的角度来看扁平化设计的5大优点
  20. 大数据查询引擎 PrestoDB

热门文章

  1. 浏览器全屏非全屏切换
  2. unix 服务器 密码修改,主流服务器UNIX操作系统用户帐号的设置.docx
  3. AD学习笔记——B站学习记录
  4. 计算机格式设置实验,Word实验3 页面格式设置
  5. CreateTextFile 方法
  6. 小米平衡车plus拆机换电池
  7. Git 命令在线练习
  8. xftp 下载文件时提示 you do not have permission to download this folder
  9. “百草味”B站破圈获Z世代青睐,美食品牌如何在B站进行年轻化营销?
  10. saas产品如何搭好架构?