浅谈Java设计模式——备忘录模式(Memento)

关于Spring 中常用的那些设计模式 Spring 中常用的设计模式 1、我们通常说的 23 中经典设计模式可以通过下表一目了然: 创建型 工厂方法模式(FactoryMethod)、抽象工厂模式(AbstractFactory)、 建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton)结构型适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、 装饰器模式(... 阅读详情

一、概述

        在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。它实现了对信息的封装,使得客户不需要关心状态保存的细节。保存就要消耗资源,所以备忘录模式的缺点就在于消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

二、使用场景

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

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

三、参与者

1.Memento 备忘录存储原发器对象的内部状态。

2.Originator 原发器创建一个备忘录,用以记录当前时刻它的内部状态。 使用备忘录恢复内部状态.。

3.Caretaker 负责保存好备忘录。 不能对备忘录的内容进行操作或检查。

四、类图

五、示例代码

1.Memento

/**
 * Memento
 * @author zhipeng_Tong
 */
public class RoleStateMemento {
    private int liftValue;
    private int attachPower;
    private int defensivePower;

    public RoleStateMemento(int liftValue, int attachPower, int defensivePower) {
        this.liftValue = liftValue;
        this.attachPower = attachPower;
        this.defensivePower = defensivePower;
    }

    public int getLiftValue() {
        return liftValue;
    }

    public void setLiftValue(int liftValue) {
        this.liftValue = liftValue;
    }

    public int getAttachPower() {
        return attachPower;
    }

    public void setAttachPower(int attachPower) {
        this.attachPower = attachPower;
    }

    public int getDefensivePower() {
        return defensivePower;
    }

    public void setDefensivePower(int defensivePower) {
        this.defensivePower = defensivePower;
    }
}

2.Originator

/**
 * Originator
 * @author zhipeng_Tong
 */
public class GameRole {
    private int liftValue;  // 生命值
    private int attachPower;    // 攻击力
    private int defensivePower; // 防御力

    public int getLiftValue() {
        return liftValue;
    }

    public void setLiftValue(int liftValue) {
        this.liftValue = liftValue;
    }

    public int getAttachPower() {
        return attachPower;
    }

    public void setAttachPower(int attachPower) {
        this.attachPower = attachPower;
    }

    public int getDefensivePower() {
        return defensivePower;
    }

    public void setDefensivePower(int defensivePower) {
        this.defensivePower = defensivePower;
    }

    // 展示状态
    public void displayState() {
        System.out.println("角色状态信息: ");
        System.out.println(String.format("生命值: %d", liftValue));
        System.out.println(String.format("攻击力: %d", attachPower));
        System.out.println(String.format("防御力: %d", attachPower));
    }

    // 初始化状态
    public void initialState() {
        this.liftValue = 100;
        this.attachPower = 100;
        this.defensivePower = 100;
    }

    // 战斗
    public void fight() {
        this.liftValue = 0;
        this.attachPower = 0;
        this.defensivePower = 0;
    }

    // 保存角色状态
    public RoleStateMemento saveState() {
        return new RoleStateMemento(this.liftValue, this.attachPower, this.defensivePower);
    }

    // 回复角色状态
    public void recoveryState(RoleStateMemento memento) {
        this.liftValue = memento.getLiftValue();
        this.attachPower = memento.getAttachPower();
        this.defensivePower = memento.getDefensivePower();
    }
}

3.Caretaker

/**
 * Caretaker
 * @author zhipeng_Tong
 */
public class RoleStateCaretaker {
    private RoleStateMemento memento;

    public RoleStateMemento getMemento() {
        return memento;
    }

    public void setMemento(RoleStateMemento memento) {
        this.memento = memento;
    }
}

4.测试代码

public class Client {
    public static void main(String[] args) {
        // 大战boss前
        // 初始化游戏角色初始状态,三项指标都为100
        GameRole gameRole = new GameRole();
        gameRole.initialState();
        gameRole.displayState();

        // 保存进度信息
        RoleStateCaretaker caretaker = new RoleStateCaretaker();
        caretaker.setMemento(gameRole.saveState());

        // 大战boss,损耗严重
        gameRole.fight();
        gameRole.displayState();

        // 回复到之前状态
        gameRole.recoveryState(caretaker.getMemento());
        gameRole.displayState();
    }
}

运行结果:

角色状态信息: 
生命值: 100
攻击力: 100
防御力: 100
角色状态信息: 
生命值: 0
攻击力: 0
防御力: 0
角色状态信息: 
生命值: 100
攻击力: 100
防御力: 100

 

哨兵1号(Sentinel-1)雷达SAR数据预处理全流程:从下载到精确配准 本文详细介绍了哨兵1号(Sentinel-1)雷达SAR数据从下载到精确配准的全流程预处理方法。内容涵盖SLC与GRD数据选择、ASF平台下载技巧,并重点解析了使用SNAP软件进行几何校正、辐射定标及高精度配准的核心步骤,为InSAR形变监测等应用提供可靠的数据基础。 阅读详情

相关推荐

在 Zemax 非序列模式下建立干涉仪模型

Zemax 利用其相干检测功能,将到达探测器的射线的能量相干地组合起来,同时考虑每条检测到的射线的幅度和相位。从对这些干涉条纹的定量评估来看,光学干涉仪具有广泛的应用,包括在天文学中用于测量天体的大小,在计量学中用于精确测量距离,在显微镜中用于提高分辨率,以及在物理和工程的各个领域中用于检测条件的微小变化。在光学干涉仪中,使用的是光波。非相干和相干相加的总功率是守恒的,但相干光束的峰值辐照度应该是非相干光束总和的 2 倍,这是理所当然的。请注意,条纹的缺失是显而易见的,因为不再从相干的角度观察探测器。

jkh920184196的博客 2380

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

本文介绍了备忘录模式的相关知识。

代码星辰的博客 1596

强化学习实战:如何用PPO算法训练一个超级马里奥AI(附完整代码)

本文提供了一份详细的强化学习实战指南,教你如何使用PPO算法训练一个能玩《超级马里奥》的AI智能体。内容涵盖从环境搭建、自定义奖励函数设计到PPO智能体的PyTorch完整实现,并附有可运行的代码,帮助开发者快速上手游戏AI开发。

h6j7k8l9p0的博客 946

Spring 备忘录

Spring 基础备忘录

EuekaJshen 306

ThingsBoard实战指南:RPC命令下发与设备交互详解

本文深入解析了ThingsBoard平台中RPC命令下发的核心机制与实战应用。通过对比客户端与服务端RPC模式,详细阐述了从仪表盘控件配置到设备端Python代码响应的完整双向交互流程,并提供了常见问题排查与进阶优化技巧,帮助开发者构建可靠、实时的物联网设备控制系统。

weixin_29168153的博客 211

AutoSAR系列讲解(深入篇)13.6-闪烁一颗LED灯 6

闪烁一颗LED灯:配置SWC和生成代码

雪云飞星的博客 1万+

【设计模式】备忘录模式

备忘录(快照)模式:Memento(Snapshot) Pattern、行为型模式 备忘录模式在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,后面可将该对象恢复到原先保存的状态。备忘录模式核心在于“后悔药”、”历史快照” 备忘录模式应用场景 1、需要保存历史快照的场景(GIT/SVN) 2、富文本保存历史快照等。 ...

起而行动,方能平定心中的惶恐 497

uniapp - 详细解决 H5 网页报错 Uncaught Error: Async component timed out after ? ms.(移动端h5页面白屏或加载缓慢失败,超时报错处理)

uni-app,vue3,网页,h5,移动端,手机H5页面,浏览器,报错,uniapp报错,Asynccomponenttimedoutafter,如何解决这个问题,vue3Asynccomponenttimedoutafter,异步组件超时了怎么办,async,详细解决方案,AsyncComponents异步组件,导致页面打不开了,白屏什么也不显示,网页载入非常慢卡顿,vue3网站报错,超时,nuxt3,详细解决方案,浏览器控制台报错,爆红并且页面卡住了,依旧报错,找不到异步组件的报错

🏆 前端领域优质创作者 3774

JAVA设计模式之备忘录模式详解

备忘录模式提供了一种对象状态的撤销实现机制,当系统中某一个对象需要恢复到某一历史状态时可以使用备忘录模式进行设计.很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。

励志成为一名优秀的全能型软件开发工程师。 2385

【FPGA教程案例87】加解密1——基于FPGA的AES加解密算法verilog实现

DES已走到了它生命的尽头。56比特密钥实在太小,虽然三重DES可以解决密钥长度的问题,但是DES的设计主要针对硬件实现,而今在许多领域,需要用软件方法来实现它,在这种情况下,它的效率相对较低。1997年4月15日美国国家标准和技术研究所(NIST)发起征集AES(Advanced Encryption Standard)算法的活动,并成立了AES工作组。目的是为了确定一个非保密的、公开披露的、全球免费使用的加密算法,用于保护下一世纪政府的敏感信息。这里,我们对AES的基本原理进行介绍:

FPGA/MATLAB学习教程/源码/项目合作开发 2545

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

伶俐角少儿编程 484

设计模式笔记22:备忘录模式(Memento Pattern)

一、备忘录模式的内容 备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。它是一种对象行为型模式,其别名为Token。 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一...

weixin_30487201的博客 217

手把手教你学Simulink--电机电磁兼容与可靠性​场景示例:基于Simulink的电机轴电压与轴电流抑制仿真

本文带你完成了电机轴电压与轴电流抑制的Simulink仿真,实现了:✅ 揭示了共模电压 → 寄生电容 → 轴电压 → 轴承电蚀的完整链路✅ 搭建了含寄生参数的高频电机等效模型共模电压最小化PWM(源头抑制)dv/dt滤波器(路径阻断)轴接地(终端泄放) ✅ 通过仿真验证了轴电压从68 V降至<3 V的显著效果 ✅ 为高可靠性电机系统提供低成本、高效益的轴承保护方案。

MHD0815的博客 315

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

一、概述在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。它实现了对信息的封装,使得客户不需要关心状态保存的细节。保存就要消耗资源,所以备忘录模式的缺点就在于消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。二、使用场景1.必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复...

weixin_35949298的博客 225

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

浅谈Java设计模式(十九)备忘录模式(Memento)

前言: 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。做个图来分析一下: Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。M

比较喜欢、笑的博客专栏 7879

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

浅谈JAVA设计模式之——备忘录模式(Memento)

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

冰河的专栏 3140

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

浅谈Memento备忘录模式

一、前言 备忘录模式用于保存和恢复对象的状态,相信大家看过我前面的拙作就会想到原型模式也能保存一个对象在某一个时刻的状态,那么两者有何不同的呢?原型模式保存的是当前对象的所有状态信息,恢复的时候会生成与保存的对象完全相同的另外一个实例;而备忘录模式保存的是我们关心的在恢复时需要的对象的部分状态信息,相当于快照。备忘录模式大家肯定都见过,比如在玩游戏的时候有一个保存当前闯关的状态的功能,会对...

学Java,找哪吒 4083

设计模式初探-备忘录模式

备忘录模式(MEMENTO),又称Token,通过在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以待需要时将该对象恢复到原先保存的状态。备忘录模式很适合实现软件中的撤销和重做功能,在字处理软件,图像编辑软件,数据库管理软件中十分常见。游戏里也常常可以使用备忘录模式来保存游戏的状态,如游戏失败前的状态,游戏暂停时的状态,以备玩家重新接着死亡前的关卡继续或从暂停状态恢复,

Java Dynamic的专栏 1454

java设计模式学习之【备忘录模式】

这篇教程不仅提供了备忘录模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1614

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

备忘录模式(Memento Pattern)是一种行为设计模式,用于在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便在需要时恢复该状态。它通常用于实现撤销操作或保存对象的历史状态。封装性好备忘录模式将对象的状态保存在一个独立的Memento对象中,避免了直接暴露对象的内部状态,保持了对象的封装性。简化状态管理通过将状态管理的逻辑集中到Caretaker中,避免了状态管理代码分散在业务逻辑中,使代码更清晰、更易维护。支持撤销/重做功能。

flzjkl的博客 1405

设计模式-备忘录模式

备忘录模式(Memento Pattern)是一种对象行为型模式,又被称为快照模式或Token模式。该模式的主要目标是,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。备忘录模式适用于需要记录和恢复对象内部状态的场景。例如,在实现撤销和重做功能时,可以使用备忘录模式来保存和恢复对象的状态。发起人(Originator)备忘录(Memento)和管理者(Caretaker)。

技术人集结地 1617

Java设计模式—备忘录模式

(尊重劳动成果,转载请注明出处:https://blog.youkuaiyun.com/qq_25827845/article/details/52462246冷血之心的博客) 目录 备忘录模式 定义如下: 通用类图如下: 角色说明: ● Originator 发起人角色 ● Memento 备忘录角色 ● Caretaker 备忘录管理员角色 通用源码如下: 备忘录模式的使用场景: 注...

冷血之心的博客 2865

JAVA【设计模式】备忘录模式

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后需要的时候,能将该对象恢复到原先的状态。

舒克日记的博客 410

Java设计模式-备忘录模式

备忘录模式是一种行为型设计模式,通过在不破坏封装性的前提下,捕获和恢复对象的内部状态。在Java中,我们可以使用发起人、备忘录和负责人类来实现备忘录模式。备忘录模式的优点包括封装性和可扩展性,但也存在内存消耗和性能开销的缺点。备忘录模式适用于需要保存和恢复对象状态的情况,并且在某些特定的应用场景中发挥作用。通过合理地运用备忘录模式,我们可以提高代码的灵活性和可维护性,从而改善软件系统的设计和开发过程。

小薯条的博客 1126

设计模式(19)——备忘录模式

目录游戏角色状态恢复问题传统方案解决游戏角色恢复备忘录模式备忘录模式解决游戏角色恢复状态实例备忘录模式的注意事项和细节 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战boss前保存自身的状态(攻击力和防御力),当大战boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态 传统方案解决游戏角色恢复 传统的设计方案(类图) 传统的方式的问题分析 一个对象,就对应一个保存对象状态...

minge0001的博客 672

备忘录模式例子

一、概述保存对象的某个状态并可以恢复到该状态二、涉及角色Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。Memento(备忘录):负责存储Originnator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memen

Programming is an art form. 3745
上一篇: 浅谈Java设计模式——中介者模式(Mediator)
下一篇: 浅谈Java设计模式——解释器模式(Interpreter)
IdealSpring
博客等级 码龄8年 9粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值