【设计模式】—-(18)备忘录模式(行为型)

二手分析仪器改造实战:如何用PMT搭建荧光检测电路(附完整电路图) 本文详细介绍了如何利用二手分析仪器中的光电倍增管(PMT)核心部件,进行荧光检测电路的实战改造。内容涵盖从PMT工作原理理解、高压供电电路设计、低噪声前置放大(跨阻放大器)到信号调理的完整流程,并提供了关键电路图与调试排错指南,旨在帮助电子爱好者与工程师低成本构建稳定、高灵敏度的专业检测系统。 阅读详情

备忘录模式(Token)

一、定义

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

二、适用场景

适合于功能比较复杂,但需要维护或记录属性历史的功能。

参与者:

      Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
  Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
  Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。

适用性:

1)必须保存一个对象在某一时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。

2)如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。


效果:

1)保持封装边界

2)简化原发器

3)使用备忘录可能代价很高

4)定义窄接口和宽接口

5)维护备忘录的潜在代价

三、UML


四、代码

  1. /**
  2.  * 游戏自身(备忘录模式中的发起人,备份的是游戏的状态)
  3.  */
  4. public class Game {

  5.     /**
  6.      * 英雄状态属性
  7.      */
  8.     private HeroState hState;

  9.     /**
  10.      * 场景状态属性
  11.      */
  12.     private SceneState sState;

  13.     public HeroState gethState() {
  14.         return hState;
  15.     }

  16.     public void sethState(HeroState hState) {
  17.         this.hState = hState;
  18.     }

  19.     public SceneState getsState() {
  20.         return sState;
  21.     }

  22.     public void setsState(SceneState sState) {
  23.         this.sState = sState;
  24.     }

  25.     /**
  26.      * 备份游戏
  27.      */
  28.     public GameMemento createMemento(){
  29.         return new GameMemento(hState,sState);
  30.     }
  31.     
  32.     /**
  33.      * 玩游戏
  34.      * @throws InterruptedException 
  35.      */
  36.     public void play(){
  37.         hState.setHP(0);
  38.         hState.setMP(0);
  39.         sState.setCoin(0);
  40.         sState.setWood(0);
  41.     }
  42.     
  43.     /**
  44.      * 游戏还原
  45.      */
  46.     public void restore(GameMemento memento){
  47.         this.hState = memento.gethState();
  48.         this.sState = memento.getsState();
  49.     }
  50. }
2、第二个文件要备份的状态实体:HeroState.java 

点击(此处)折叠或打开

  1. /**
  2.  * 游戏英雄人物状态实体 
  3.  */
  4. public class HeroState implements Cloneable{

  5.     /**
  6.      * 英雄生命值
  7.      */
  8.     private int HP;
  9.     
  10.     /**
  11.      * 英雄魔法值
  12.      */
  13.     private int MP;
  14.     
  15.     /**
  16.      * 状态保存时间
  17.      */
  18.     private Date stateDate;

  19.     public int getHP() {
  20.         return HP;
  21.     }

  22.     public void setHP(int hP) {
  23.         HP = hP;
  24.     }

  25.     public int getMP() {
  26.         return MP;
  27.     }

  28.     public void setMP(int mP) {
  29.         MP = mP;
  30.     }

  31.     public Date getStateDate() {
  32.         return stateDate;
  33.     }

  34.     public void setStateDate(Date stateDate) {
  35.         this.stateDate = stateDate;
  36.     }
  37.     
  38.     public HeroState clone(){
  39.         try {
  40.             return (HeroState) super.clone();
  41.         } catch (CloneNotSupportedException e) {
  42.             // TODO Auto-generated catch block
  43.             e.printStackTrace();
  44.         }
  45.         return null;
  46.     }
  47. }
3、要备份的状态实体:SceneState.java 

点击(此处)折叠或打开

  1. /**
  2.  * 游戏场景状态实体 
  3.  */
  4. public class SceneState implements Cloneable{

  5.     /**
  6.      * 金币数量
  7.      */
  8.     private int coin;
  9.     
  10.     /**
  11.      * 木材数量
  12.      */
  13.     private int wood;
  14.     
  15.     /**
  16.      * 地图名称
  17.      */
  18.     private String mapName;

  19.     public int getCoin() {
  20.         return coin;
  21.     }

  22.     public void setCoin(int coin) {
  23.         this.coin = coin;
  24.     }

  25.     public int getWood() {
  26.         return wood;
  27.     }

  28.     public void setWood(int wood) {
  29.         this.wood = wood;
  30.     }

  31.     public String getMapName() {
  32.         return mapName;
  33.     }

  34.     public void setMapName(String mapName) {
  35.         this.mapName = mapName;
  36.     }
  37.     
  38.     public SceneState clone(){
  39.         try {
  40.             return (SceneState) super.clone();
  41.         } catch (CloneNotSupportedException e) {
  42.             // TODO Auto-generated catch block
  43.             e.printStackTrace();
  44.         }
  45.         return null;
  46.     }
  47. }
4、第四个文件备忘录角色:GameMemcento.java 

点击(此处)折叠或打开

  1. /**
  2.  * 游戏备忘录角色
  3.  */
  4. public class GameMemento{

  5.     /**
  6.      * 英雄状态
  7.      */
  8.     private HeroState hState;
  9.     
  10.     /**
  11.      * 场景状态
  12.      */
  13.     private SceneState sState;
  14.     
  15.     /**
  16.      * 构造方法
  17.      * @param hState
  18.      * @param sState
  19.      */
  20.     public GameMemento(HeroState hState,SceneState sState){
  21.         this.hState = hState.clone();
  22.         this.sState = sState.clone();
  23.     }

  24.     /**
  25.      * 获取备份状态
  26.      * @return
  27.      */
  28.     public HeroState gethState() {
  29.         return hState;
  30.     }

  31.     /**
  32.      * 获取备份状态
  33.      * @return
  34.      */
  35.     public SceneState getsState() {
  36.         return sState;
  37.     }
  38. }
5、第五个文件备忘录管理角色:Caretaker.java 

点击(此处)折叠或打开

  1. /**
  2.  * 备忘录管理器
  3.  */
  4. public class Caretaker {

  5.     /**
  6.      * 备忘录实体
  7.      */
  8.     private GameMemento memento;

  9.     public GameMemento getMemento() {
  10.         return memento;
  11.     }

  12.     public void setMemento(GameMemento memento) {
  13.         this.memento = memento;
  14.     }
  15. }
6、第六个文件:TestMain.java 

点击(此处)折叠或打开

  1. /**
  2.  * 测试Main方法
  3.  */
  4. public class TestMain {

  5.     public static void main(String [] args){
  6.         Game game = new Game();
  7.         HeroState hState = new HeroState();
  8.         hState.setHP(100);
  9.         hState.setMP(100);
  10.         SceneState sState = new SceneState();
  11.         sState.setCoin(1000);
  12.         sState.setWood(1000);
  13.         game.sethState(hState);
  14.         game.setsState(sState);
  15.         System.out.println("游戏状态备份开始");
  16.         GameMemento memento = game.createMemento();
  17.         Caretaker ct = new Caretaker();
  18.         ct.setMemento(memento);
  19.         System.out.println("游戏状态备份完成");
  20.         System.out.println("开始游戏,当前英雄生命值:" + game.gethState().getHP());
  21.         game.play();
  22.         System.out.println("游戏结束,当前英雄生命值:" + game.gethState().getHP());
  23.         System.out.println("游戏状态还原开始");
  24.         game.restore(ct.getMemento());
  25.         System.out.println("游戏状态还原结束");
  26.         System.out.println("当前英雄生命值:" + game.gethState().getHP());
  27.     }
  28. }

五、总结

备忘录模式

优点:

1)在同一个集合上可有多个状态一起工作

2)不需要为支持迭代而破坏一个集合的封装性。

缺点:

将对象状态备份会占用比较多的系统资源。

Windows 下 Codex MCP 服务配置全攻略:从环境搭建到实战避坑 本文详细介绍了在Windows系统下配置Codex MCP服务的完整流程与实战避坑指南。内容涵盖从Node.js环境搭建、Codex CLI安装,到核心配置文件config.toml的编写与解析,并重点解决了Windows平台特有的环境变量设置、MCP服务启动命令适配等关键难点,帮助开发者顺利完成从环境准备到编辑器插件连接的整个配置过程。 阅读详情

相关推荐

手教你如何使用Simulink和相关工具箱模拟和实现无人机的多机接力信号中继的建模

扩大通信范围:单架无人机的通信能力有限,通过多机接力的方式可以显著扩展通信覆盖范围。提高可靠性:当某架无人机出现故障或电量不足时,其他无人机可以接管其任务,确保通信不中断。适应复杂环境:在山区、森林等复杂地形中,多机接力可以绕过障碍物,建立稳定的通信链路。使用Communications Toolbox中的模块来模拟无线通信链路。例如,可以使用模块模拟噪声信道,或者使用模块计算信号衰减。matlab深色版本。

MHD0815的博客 767

设计模式第20讲——备忘录模式(Memento)

备忘录模式又称快照模式,是一种行为型设计模式。一、什么是备忘录模式 二、角色组成三、优缺点 四、应用场景五、代码实现 5.0 UML类图 5.1 EditorMemento——备忘录(Memento)5.2 Editor——源发器(Originator)5.3 History——管理者(Caretaker)5.4 testMemento 六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 5076

微信公众号数据采集实战:历史文章、互动数据与评论详情全解析

本文提供了一套完整的微信公众号数据采集实战方案,详细解析了如何通过接口调用获取公众号的历史文章列表、单篇文章的互动数据以及详细的用户评论。文章从环境准备、核心参数解析到分页逻辑、批量处理和异常处理,提供了可运行的Python代码示例,旨在帮助开发者高效、稳定地构建自动化采集工具,用于竞品分析、内容研究和舆情监控。

u5v6w7的博客 1598

23种设计模式之备忘录模式(Memento Pattern)

本篇文章将23种设计模式中的备忘录模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 684

离线安装 nvidia-docker2(nvidia-container-toolkit)

很多时候大家都有用docker使用gpu的需求,但是因为网络等原因不是那么好用,这里留了一个给ubuntu的安装包,网络好的话也提供了在线安装方式。

father_yingying的博客 1181

备忘录模式

如果需要保存一个对象的内部状态,但是如果用接口来让其他对象直接得到这些需要保存的状态,将会暴露对象的实现细节并破坏对象的封装性,这时可以使用备忘录模式,把备忘录对象实现成为原发器对象的内部类,而且还是私有的,从而保证只有原发器对象才能访问该备忘录对象。使用备忘录对象来封装和保存需要保存的内部状态,然后把备忘录对象保存到管理者对象中,在需要的时候,再从管理者对象中获取备忘录对象,来恢复对象的状态。备忘录模式备忘的就是原发器对象的内部状态,这些内部状态是不对外的,只有原发器对象才能够进行操作。

Filwaod 2918

NVIDIA DGX Spark实战:如何在桌面上轻松运行200B参数大模型(附配置教程)

本文提供了NVIDIA DGX Spark在桌面端运行200B参数大模型的完整实战指南。详细介绍了从硬件初始化、系统配置、容器化环境搭建,到模型加载、量化、推理流水线编写及性能调优的全过程。重点阐述了如何利用其统一内存架构和TensorRT-LLM等工具进行高效本地推理,并探讨了通过双机互联扩展以应对超大规模模型的方法。

i3j4k5的博客 782

深入浅出设计模式 - 备忘录模式

深入浅出设计模式 - 备忘录模式

激流丶的博客 2985

基于STM32的智能鞋柜系统设计与实现

摘要:本文设计并实现了一种基于STM32F103C8T6单片机的智能鞋柜系统。该系统通过DHT11温湿度传感器、PM2.5粉尘传感器和MQ-135空气质量传感器构建多维度环境监测网络,结合光电红外传感器和光敏传感器实现柜门状态识别与智能照明。系统采用分层控制策略,当温度低于15℃或湿度高于65%时自动启动加热和通风,PM2.5超标时启动通风,污染物浓度升高时激活紫外线杀菌。创新性地实现了柜门状态与紫外线消毒的双保险互锁机制,确保使用安全。测试结果表明,系统温湿度控制精度达±0.4℃/±2.0%RH,PM2.

3254968421的博客 253

【Android面试八股文】Android Application为什么是单例?

这道题相对简单,就是考察大家是否了解application的创建流程。的实例,它用来存储和处理整个全局变量的一些事情,它同时还是一个。为空的时候,才会创建,从而保证了它是一个单例对象。一样有自己的生命周期,但是它并没有那么复杂,因为。对象的创建过程,找出它为什么是单例的原因。全局进行一些配置,比如配置插件。的时候才会创建,所以说可以在。凭什么是单例,我们查看下。启动的时候都会创建一个。是怎么一步步创建的。是一个单例,即每一个。

字节卷动 532

设计模式-备忘录模式(Memento)

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许你捕获对象的内部状态,并在需要时恢复该状态,而无需暴露该对象的实现细节。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可以将该对象恢复到原先保存的状态。这种模式的名字可能对一些人来说稍微有点陌生,但其另一个名字快照模式可能会让人觉得更为熟悉。备忘录模式的适用场景包括:需要保存和恢复数据的场景,例如,编辑文档时需要撤销操作;需要避免重复计算的场景,例如,斐波那契数列;

miaoyl的博客 2071

【AI智能体】Coze 打通MySql实现数据报表展示应用搭建详解

Coze 打通MySql实现数据报表展示应用搭建详解

congge 3857

【从零入门23种设计模式18】行为型之备忘录模式

摘要:备忘录模式是一种行为型设计模式,用于在不破坏封装性的前提下捕获对象内部状态并保存到外部,以便后续恢复。该模式通过"原发器"生成状态快照、"备忘录"存储状态、"负责人"管理快照,实现状态备份与恢复功能。典型应用场景包括文档编辑器撤销、游戏存档、事务回滚等。文章详细介绍了备忘录模式的实现原理,包括核心角色定义、UML类图、Java代码示例,以及Spring实战案例(订单状态回滚)。同时分析了模式的优缺点,比较了与原型模式的差异,并列举了JDK/S

2401_87662859的博客 839

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

23种设计模式(18)_行为型_备忘录模式(Memento Pattern)

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。备忘录模式的优点有:当发起人角色中的状态改变时,有可能这是个错误的改变,我们使用备忘录模式就可以把这个错误的改变还原。备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。备忘录模式的缺点:在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的。

heyuchang666的专栏 606

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【设计模式(18)】行为型模式之备忘录模式

个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道 如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充 前言 常说,”世上没有后悔药“,现实中的确如此,但在计算机应用中,我们大量提供了”后悔“的机会,以防我们需要弥补自己的”过失“ 比如,游戏玩家非常熟悉的“存档”功能(SL大法好),编辑器的撤销/重做功能功能,数据库与操作系统的备份功能等等 比如前两天,字节的某老哥删掉了公司的全部1GB以下模型,如果不能恢复数据,恐怕我们讨论的就不只是去留问题了。。。 即,保存一个对象的某个状态,以便在.

路远不知归 176

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式Java版:18备忘录模式(行为型)

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下捕获对象的内部状态,并在需要时恢复对象到之前的状态。备忘录模式的核心思想是将对象的状态保存到一个备忘录对象中,以便在需要时可以还原到先前的状态。这样可以在不暴露对象内部细节的情况下,提供对对象状态的恢复和回滚的能力。

luckywuxn的博客 121

JAVA SCRIPT设计模式--行为型--设计模式之Memnto备忘录模式(18)

一个备忘录(memento)是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称为备忘录的原发器(originator)。但是对象通常封装了其部分或所有的状态信息 , 使得其状态不能被其他对象访问,也就不可能在该对象之外保存其状态。4)根据SolverState备忘录中的信息,ConstraintSolver改变它的内部结构以精确地将它的等式和变量返回到它们各自先前的状态。这一方案允许ConstraintSolver把恢复先前状态所需的信息交给其他的对象,而又不暴露它的内部结构和表示。

火柴盒 400

18、设计模式(行为型)之备忘录模式

作用 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 何时使用 很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。 优点 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态 实现了信息的封装,使得用户不需要关心状态的保存细节。 实例 ...

为什么坚持,想一想当初 250

【Java教程】Day20-18 设计模式:行为型模式——备忘录模式(Memento)

备忘录模式(Memento Pattern)主要用于捕获一个对象的内部状态,并将该状态保存到外部,在不破坏封装性的前提下,能够在后续恢复该状态。这种模式的核心思想是:通过备份对象的状态,使得对象能够在不暴露内部结构的情况下进行状态恢复。 在现实生活中,我们经常会遇到类似的场景:文本编辑器的“撤销”和“重做”功能,图像编辑器的“撤回”和“恢复”,甚至一些高级软件的历史版本管理,都是备忘录模式的应用场景。

max202011161630的博客 707

设计模式(18)-行为型-备忘录模式(Memento)

概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 适用性 1.必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。 2.如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。 参与者 1.Memento 备忘录存储原

iihero@优快云 2002

设计模式精讲 Day 18:备忘录模式(Memento Pattern)

备忘录模式是一种行为型设计模式,它允许在不暴露对象内部状态的情况下,捕获并存储该对象的状态,以便后续恢复。通过这种方式,可以实现对象的回退、撤销等功能。核心思想保存状态:在对象发生变化之前,将其状态保存下来。恢复状态:在需要的时候,将对象恢复到之前保存的状态。封装性:状态的保存和恢复过程对外部是透明的,不依赖于对象的内部实现。本篇文章详细讲解了备忘录模式的定义、结构、适用场景、实现方式及优缺点分析,并通过一个文本编辑器的案例展示了其实际应用场景。

在未来等你的专栏 1076

设计模式(4)——行为型模式1

本篇博客我们说的是行为型模式,其中包括以下一种模式:观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。          13.管擦者模式 定义了一种一对多的依赖关系,让多个观察者对

许德鹏 1088

行为型模式之备忘录模式

行为型模式之备忘录模式模式结构和说明 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式 这个模式的思想对大家来说应该很熟悉,很多时候在编程的时候,不小心删了某一段代码或者写错了,咱们都用CMD+Z恢复到原来的状态,那么怎么做到的呢?就是使用备忘录模式,在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,...

qq_30357519的博客 358

设计模式 18 备忘录模式

备忘录模式的核心思想是将对象的状态保存在一个备忘录对象中,并允许在未来的某个时刻恢复该状态。备忘录模式保证了状态的封装性,外部对象无法直接访问备忘录中的内容,从而保护了原发器对象的内部细节。备忘录模式通过保存对象的状态,提供了恢复该状态的机制。它通过封装状态,确保了对象内部细节的保护,同时又允许状态的恢复。该模式非常适合用于实现“撤销/恢复”功能,并在需要管理复杂状态变更的场景中提供了很好的解决方案。

Winemonk 1430

JAVA设计模式之备忘录模式

转自http://www.kongzid.com/archives/design18,备忘录模式又叫做快照模式,指在不破坏封装性的前提下,获取到一个对象的内部状态,并在对象之外记录或保存这个状态。在有需要的时候可将该对象恢复到原先保存的状态。我们相当于把对象原始状态备份保留,所以叫备忘录模式。 备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。其实很多应用软件都提供了这项功能,如 Word、记事本、Ph...

孔子说 670
上一篇: 【Python】学习笔记——-1、什么是Python?
下一篇: 【Python】学习笔记——-2、Python简介
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值