介绍

是一种行为模式

用于保存对象当前状态,并在之后恢复到此状态(后悔药)

需要保证被保存的对象状态不能被外部访问,保证内部完整性,不向外透露

定义

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

使用场景

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

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

角色介绍

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

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

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

简单实现

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

/** * 备忘录类 */ public class Memoto { public int mCheckpoint; public int mLifeValue; public String mWeapon; @Override public 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()); } @Override public 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角色的直接访问,满足对象状态存取功能的同时也是的该模块的结构保持清晰、整洁。

java备忘录模式_Java设计模式之备忘录模式相关推荐

  1. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java解耦的模板模式_Java 设计模式(9) —— 模板模式

    一.模板模式 封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现.模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板模式 二.示例 泡咖啡与泡茶: 泡咖啡的步骤: 水 ...

  3. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  4. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  5. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  6. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  7. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  8. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  9. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

最新文章

  1. Numpy的介绍和优势
  2. 用户和用户组的简单总结
  3. webpack打包第三方类库的正确姿势
  4. 线程条件控制实现线程的同步
  5. 太极发送卡片软件_QQ卡片式消息一键发送app
  6. python api调用百度ai平台_Python 百度AI接口调用
  7. 华为Mate 40 Pro钢化膜上手:6.6寸大曲率瀑布屏 黑边加速消失
  8. zk可实现分布式锁,Redis也可实现,之间有什么区别?
  9. 精通MVC3摘译(9)-过滤器
  10. 计算机网络相关知识(http状态码 首部字段)
  11. Server(Iocp)的那些烦恼
  12. TCP/IP四层协议模型与ISO七层模型(TCP/IP系统学习(2))
  13. 为什么魂斗罗只有128KB却能实现那么长的剧情有答案了
  14. 游戏挂机运行脚本方法
  15. 关于1NF、2NF、3NF、BCNF的常考判定
  16. 小程序 (基础认识)
  17. 【云计算】私有云在VMware下虚拟机的创建与配置(图文教程)
  18. 半加器——Verilog HDL语言
  19. 负基差会对股票量化对冲造成什么影响?
  20. JSP——标准标签库 (JSTL)

热门文章

  1. WS2812B使用备忘
  2. 单品最佳采购量和最佳库存量的计算方法
  3. 影育科技在上海市卢湾高级中学开展常规性元宇宙系列课程教学,上海市教委相关领导莅临现场观摩指导
  4. 本来WOW可以不用加入防沉迷的,现在看来不可能了
  5. Nginx高阶用法(三)
  6. 喝酒摇骰子重启人生多款微信小程序源码分享
  7. 固定资产设备管理系统
  8. 揭秘BAT等互联网公司的薪酬结构
  9. kuku大神排查错误过程
  10. 【五】Socket函数详解