备忘录模式详解

备忘录模式又叫作快照模式或Token模式,是一种对象的行为模式。在备忘录模式里,一个备忘录是一个对象,它存储另一个对象(原发器对象)在某个瞬间的内部状态。备忘的目的就是为了以后在需要的时候,可以将原发器对象的状态恢复到备忘录所保存的状态。
备忘录的本质:保存和恢复状态
设计意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态了。

备忘录模式的结构

备忘录模式涉及的角色及其职责如下:

原发器角色:原发器根据需要决定将自己的哪些内部状态保存到备忘录中,并可以使用备忘录来恢复内部状态。
备忘录角色:负责存储原发器对象的内部状态,但是具体需要存储哪些状态是由原发器对象来决定的。另外备忘录应该只能由原发器对象来访问它内部的数据,原发器外部的对象不应该访问到备忘录对象的内部数据。
为了控制对备忘录对象的访问,备忘录模式中出现了窄接口和宽接口的概念。
窄接口:管理者只能看到备忘录的窄接口,窄接口的实现中通常没有任何的方法,只是一个类型标识。窄接口使得管理者只能将备忘录传递给其他对象。
宽接口:原发器能够看到备忘录的宽接口,从而可以从备忘录中获取到所需的数据,来将自己恢复到备忘录中所保存的状态。理想情况是:只允许生成备忘录的原发器来访问该备忘录的内部状态,通常实现成为原发器内的一个私有内部类。
管理者(Caretaker)角色:备忘录管理者,或者称为备忘录负责人。主要负责保存好备忘录对象,但是不能对备忘录对象的内容进行操作或检查。

示例:


/*** <h3>design-mode</h3>* <p>备忘录的窄接口,没有任何方法定义</p>** @author : ZhangYuJie* @date : 2022-05-08 19:16**/

再看看原发器角色,它里面会有备忘录对象的实现,此处将真正的备忘录对象当作原发器对象的一个私有内部类来实现。示例代码:

package com.example.designmode.memento;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-05-08 19:16**/public class Originator {/*** 示意,表示原发器的状态*/private String state = "";/*** 创建备忘录,保存原发器的状态** @return 创建好的备忘录对象*/public Memento createMemento() {return new MementoImpl(state);}/*** 将原发器恢复到备忘录中保存的状态* 保存有原发器状态的备忘录对象* @param*/public void recoverFromMemento(Memento memento) {MementoImpl mementoImpl = (MementoImpl) memento;this.state = mementoImpl.getState();}public String getState() {return state;}public void setState(String state) {this.state = state;}/*** 真正的备忘录对象,实现了备忘录窄接口 实现成私有的内部类,不让外部访问*/private static class MementoImpl implements  Memento {/*** 示意,表示需要保存的状态*/private String state = "";public MementoImpl(String state) {super();this.state = state;}public String getState() {return state;}}}

备忘录管理者的示例代码。

package com.example.designmode.memento;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-05-08 19:16**/public class Caretaker {/*** 记录被保存的备忘录对象*/private Memento memento = null;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}

main方法来测试一下:

package com.example.designmode.memento;/*** <h3>design-mode</h3>* <p></p>** @author : ZhangYuJie* @date : 2022-05-08 19:18**/public class Client {public static void main(String[] args) {// 创建一个原发器Originator o = new Originator();// 设置其初始状态o.setState("state 0");// 打印原发器当前的状态System.out.println("原发器的初始状态:" + o.getState());// 将原发器当前的状态保存到备忘录中Memento memento = o.createMemento();// 创建一个管理者Caretaker c = new Caretaker();// 将创建好的备忘录交给管理者进行管理c.setMemento(memento);// 改变原发器的状态o.setState("state 1");// 打印原发器当前的状态System.out.println("原发器改變后状态:" + o.getState());// 将原发器状态恢复到备忘录保存的状态o.recoverFromMemento(c.getMemento());// 再次打印原发器当前的状态System.out.println("原发器恢復后状态:" + o.getState());}
}

结果:

原发器的初始状态:state 0
原发器改變后状态:state 1
原发器恢復后状态:state 0

备忘录模式适用场景:

如果必须保存一个对象在某一个时刻的状态,方便在以后需要的时候,可以把该对象恢复到先前的状态

备忘录模式的优缺点:

优点
在备忘录模式中,原发器不再需要管理和保存其内部状态的一个个版本,而是交由管理者或客户端对这些状态的版本进行管理,从而让原发器对象得到简化
缺点:
管理者负责维护备忘录,但是管理者并不知道备忘录中有多少个状态。因此当存储备忘录时,一个本来很小的管理者,可能会产生大量的存储消耗

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

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

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

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

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

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

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

  4. Java设计模式--备忘录模式

    游戏角色状态恢复问题         游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大 战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态 传统方案解决游戏 ...

  5. JAVA 设计模式 备忘录模式

    用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构 图- ...

  6. java memento_浅谈Java设计模式——备忘录模式(Memento)

    一.概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.它实现了对信息的封装,使得客户不需要关心状态保存的细节.保存就要消耗资源 ...

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

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/52462246冷血之心的博客) 目录 备忘录模式 定义如下: 通用 ...

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

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

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

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

最新文章

  1. 2020年涨薪26-30%,能实现吗?18%数据科学家是这么期待的
  2. 什么Linux服务器最适合你?
  3. 求1!+2!+3!+...+10!的值
  4. 在 Linux 中如何禁止用户登录
  5. Kundera 2.1 发布,NoSQL 的 ORM 框架
  6. 1.2低级线程处理API
  7. C#简单银行管理系统
  8. tp6导出Excel表格
  9. 数据库 求闭包、求候选码、范式转换、最小依赖集、无损分解及保持函数依赖
  10. 科大讯飞语音转写以及语音合成配置+遇到问题处理
  11. 俄罗斯决定退出国际空间站项目 马斯克:“一路顺风”
  12. 基于低代码为企事业单位打造督办事务管理一体化协同管控平台
  13. 中关村硬科技孵化器首次合作建科技成果转化创新平台
  14. 安卓模拟器最优选择+抖音检测全绕过简述
  15. 计算机视觉之--使用opencv生成简笔画小视频
  16. 计算机中的信息表示教学计划,人教版小学五年级信息技术教学计划(小编推荐)...
  17. 视觉和imu(惯性传感器)( 一)
  18. 通过js实现金字塔(星号金字塔,回文对称数字金字塔)
  19. Tomcat部署Web项目
  20. 【矩阵论】1.准备知识——复数域上的内积域正交阵

热门文章

  1. C盘垃圾文件清理方法
  2. 办理一个香港银行帐户,请问有哪些银行可以考虑?
  3. 嘀嗒陪诊v1.1.1 陪护 养老服务 家政
  4. 大创项目计算机科学与技术,计算机系4个项目入选2020大创第二批
  5. CSS之通过伪元素添加图标字体
  6. Flutter Dio包网络请求抓包解决方案
  7. php 生成性格图片,PS制作个性文字人物图像教程
  8. [转]手机按键生产工艺简介
  9. 工艺夹具-减速箱体零件工艺规程及加工φ52H8孔夹具设计(论文+说明书+工艺卡+外文翻译+CAD图纸)
  10. 西部数码虚拟主机服务器配置,西部数码虚拟主机预装软件功能介绍