设计模式-19备忘录模式

小谈设计模式(19)—备忘录模式 对设计模式中备忘录模式进行详细讲解分析 阅读详情

备忘录模式

基本介绍:
  1. 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态
  2. 可以这样理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同遇见的事情,以防忘记。而在软件层面,备忘录模式有着相同的意义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作
  3. 备忘录模式属于行为型模式
原理类图:

在这里插入图片描述

角色说明:
  • originator :需要保存状态的对象
  • Memento :备忘录对象,负责保存好记录,即originator内部状态
  • CareTaker:守护者对象,负责保存多个备忘录对象,使用集合管理,提高效率
  • 说明:如果需要保存多个originator对象的不同时间的状态,也可以只需要改变Caretaker中的集合类型
案例:

​ 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态,大战后体力下降,然后从备忘录对象恢复到大战前状态
在这里插入图片描述

/**
 * 备忘录角色
 */
public class Memento {
    private int vit;
    private int def;

    public Memento(int vit, int def) {
        this.vit = vit;
        this.def = def;
    }

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}

/**
 * 源对象状态
 */
public class GameRole {
    private int vit;
    private int def;

    //创建memento,即根据当前的状态得到memento
    public Memento createMemento(){
        return new Memento(vit,def);
    }

    public void recoverFromMemento(Memento memento){
        this.vit = memento.getVit();
        this.def = memento.getDef();
    }

    public void display(){
        System.out.println("游戏角色当前的防御力 " + this.def + "攻击力:" + this.vit);
    }

    public int getVit() {
        return vit;
    }

    public void setVit(int vit) {
        this.vit = vit;
    }

    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }
}

/**
 * 守护者对象,保存游戏角色状态
 * 这里是保存一个
 */
public class Caretaker {
    private Memento memento;

    public Memento getMemento() {
        return memento;
    }

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

public class Client {

    public static void main(String[] args) {
        Caretaker caretaker = new Caretaker();
        GameRole gameRole = new GameRole();

        gameRole.setDef(100);
        gameRole.setVit(100);
        System.out.println("大战Boss之前的状态");
        gameRole.display();

        caretaker.setMemento(gameRole.createMemento());
        System.out.println("大战Boss之后的状态");
        gameRole.setVit(50);
        gameRole.setDef(50);
        gameRole.display();

        System.out.println("状态恢复。。。后");
        gameRole.recoverFromMemento(caretaker.getMemento());
        gameRole.display();
    }
}
备忘录模式注意事项和细节:
  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便的回到某个历史状态
  • 实现了信息的封装,使得用户不需要关心状态的保存细节
  • 如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存,这点需要注意
  • 使用场景:后悔药、数据库事务的管理、IE中的后退
  • 为了节省内存,备忘录模式可以和原型模式配合使用
C#设计模式教程(19):备忘录模式 备忘录模式(Memento Pattern)是一种行为设计模式,允许在不暴露对象实现细节的情况下捕获并保存对象的当前状态,以便可以在未来的某个时刻恢复到这个状态。这种模式在进行需要撤销操作的应用程序时非常有用,比如文字处理器、游戏的保存和加载、数据库事务的回滚等。发起人(Originator):这是我们希望保存其状态的对象。备忘录(Memento):一个用于存储发起人状态的对象。负责人(Caretaker):负责保存备忘录,但不对备忘录的内容进行操作或检查。 阅读详情

相关推荐

RoboMaster新手必看:用STM32 HAL库搞定大疆M3508电机正反转(附完整代码)

本文详细介绍了如何使用STM32 HAL库驱动大疆M3508电机实现正反转控制,包括硬件准备、PWM配置、电机校准及完整代码实现。特别针对RoboMaster新手常见问题提供了解决方案,如电机抖动、不转等故障排查,并分享了缓启动、DMA更新等进阶技巧,帮助开发者快速掌握电机控制核心技术。

weixin_42519985的博客 226

【C#设计模式(19)——备忘录模式(MementoPattern)】

备忘录模式:将想要备份的信息交给备忘录对象来管理。通过设置初始、备份、修改、恢复等状态展示备忘录模式的使用。

weixin_43626218的博客 663

【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化

演化博弈论是研究个体在特定环境中如何通过策略选择与其他个体进行互动的学科。这一理论在生物学、经济学和社会科学等多个领域都有广泛应用。本文将深入探讨双方演化博弈的原理及其过程,并解读一段 MATLAB 代码,展示如何模拟这一过程。

当回首往事的时候,不会因虚度年华而悔恨,也不会因碌碌无为而羞愧。 6197

java 23 种设计模式-19-java 备忘录模式(Memento Pattern)

目录 目录 备忘录模式 实际案例 定义 测试 实现方式 UML & Code UML Code 系列导航 备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。 备忘录模式属于行为型模式。 实际案例 类信息概览: 类名 说明 Main.java 方法的总入口 Me...

3万+

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 349

Vector CANape的使用记录

开门见山,今天想和大家分享下CANape使用记录,分享原因是近日在分析一个客户现场软件问题时,需要用到CANape来实时的监测ECU中的变量,因为之前对CANape的认知比较浅薄,觉得标定工程师使用他就足够了,但是这次的经历让我觉得需要写点东西来记录自己学习并使用他的过程。 相信大家能够在网上找到很多关于如何使用CANape的文章,从新建Project到后面的数据的观测、保存以及回放等等。我个人也是这么学过来的,所以我不打算从那些方面着手去描述如何使用她,而是根据我的真实使用过程以及问题的抛出到如何解决来

2万+

.NET设计模式(19):备忘录模式(Memento Pattern)

        备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。[1]         备忘录模式(Memento Pattern)应用于保存和跟踪对象的状态,以便于必要的时候可以把对象恢复到以前的状态。备忘录模式可以为一个对象提供状态存储和状态恢复的手段。 一个备忘录是一个对象,这个对象保持了一些状态信息。 

微软新技术 942

BOE CHPI协议解析:高速显示驱动的核心技术

本文深入解析了BOE CHPI协议,这是一种为高分辨率、高刷新率显示面板设计的时钟嵌入式高速点对点接口技术。文章详细阐述了其三层架构(物理层、链路层、协议层)、核心机制(如链路训练与BCC通道)以及如何通过高速串行差分传输解决大尺寸屏幕内部数据传输的带宽与干扰难题,是驱动8K、窄边框等高端显示应用的关键核心技术。

m9n0o的博客 543

19.设计模式——备忘录模式

备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。 何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"

蓝色的天空的博客 1198

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

6-Halcon-- var_threshold 函数功能(用于基于局部统计特性的动态阈值分割的算子)

var_threshold 是 HALCON 中用于基于局部统计特性的动态阈值分割的算子,特别适用于处理低对比度图像或纹理均匀但包含细微差异的场景。与 dyn_threshold 不同,它不依赖预处理生成的参考图像,而是直接在局部区域内计算灰度值的统计特性(均值和标准差),从而自适应调整阈值。

weixin_45590420的博客 1326

【python设计模式】19、备忘录模式

例如,在一个游戏中,我们可以使用备忘录模式来保存玩家的状态,以便在需要时恢复它们,或者在玩家离线时自动保存状态。备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏对象封装性的前提下,捕获对象的内部状态并在对象之外保存该状态,以便在需要时恢复对象的状态。总之,备忘录模式的哲学思想是,保存和恢复对象状态的能力对于软件设计来说非常重要,它可以帮助我们更好地管理对象的状态,并提高软件的可维护性和可靠性。订单状态的保存和恢复:在电商网站中,订单状态的保存和恢复可以使用备忘录模式来实现。

Htojk的博客 1061

rk628d修改默认分辨率

在rk3568上使用628d hdmi转mipi,在628d已经调试好的情况下,客户新增需求:视频输入这边的推荐分辨率固定在1024x768。

m0_60805802的博客 2052

极速理解设计模式系列:19.备忘录模式(Memento Pattern)

四个角色:原发器(Originator)、备忘录(Memento)、看管者(Caretaker)、客户端(Client) 原发器(Originator):需要备忘录来记忆其内部状态的原型。可以将本类状态保存到备忘录,也可以通过备忘录恢复状态。 备忘录(Memento):保持原发器的内部状态, 看管者(Caretaker):看管备忘录,不可修改...

weixin_30916125的博客 79

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

19行为型设计模式——备忘录模式

Originator(发起人)负责创建一个备忘录Memento,记录当前时刻的内部状态。提供创建备忘录和恢复备忘录数据的功能。可以访问备忘录里的所有信息。Memento(备忘录)负责存储Originator的内部状态。防止Originator以外的对象访问备忘录。提供接口供Originator获取和设置状态。Caretaker(管理者)负责管理备忘录Memento。不能访问或操作Memento的内容。

qq_55610255的博客 1642

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

minge0001的博客 672

假人有限元模型

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

C#设计模式之19——备忘录模式

备忘录模式用来保存与对象有关的数据,这样可以在将来对对象进行复原。例如在绘图程序中需要保存对象的颜色尺寸等。 备忘录模式中定义了三个角色: 1. 发起者:指我们要保存其状态的对象,比如说一个图形对象的位置,颜色等。 2. 备忘录: 保存发起者状态的对象。 3. 监护者: 管理状态的保存时机,保存备忘录,以及如果需要的话使用备忘录回复发起者的状态。   我们举个例子来具体的了解备忘录模式

Work Hard, Play Harder! 3050

设计模式 19 备忘录模式

我们的生活一旦留下遗憾,不管多么悔恨、多么懊恼、多么渴望,往往都回不去了!程序虽然来源于生活,有时候也能高于生活,比如遗憾,在程序中就是能补救的。游戏中有存档和读档,设计模式中也有备忘录模式可以实现。备忘录模式就是为程序提供了一个可回溯的时间节点,如果程序在运行过程中某一步出现了错误,就可以回到之前的某个被保存的节点上重新来过(就像艾克的大招)。平时编辑文本的时候,当编辑出现错误时,就需要撤回,此时只需要按下 Ctrl + Z 就可以回到上一步,这样大大方便了文本编辑。

天河有尽后为涯,星海无边前作岸。 213

C++设计模式19——备忘录模式

备忘录模式 在GOF的《设计模式:可复用面向对象软件的基础》一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

chenyijun的专栏 392

设计模式 - 19 Memento 备忘录模式

一、什么是备忘录模式     Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象的内部状态,并在需要的时候(undo/rollback)恢复对象以前的状态。 二、备忘录模式的应用场景         如果一个对象需要保存状态并可通过undo或rollback等操作恢复到以前的状态时,可以使用Memento模式。 1)一个类需要保存它的对象的状态(相当于Origin

songuo' s home 720

【设计模式】19,备忘录模式

(十九)备忘录模式 备忘录模式(Memento Pattern)指在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。类似于快照机制。 1,备忘录模式的设计原则 1,发起人(Originator):负责创建一个备忘录,记录自身需要保存的状态; 2,备忘录(Memento):用于存储Originator的内部状态,且可以防止Originator以外的对象进行访问; 3,备忘录管理员(Caretaker):负责备忘录的管理与创建。 2,简单案例 草稿箱的实现就是一个备忘录的形式,通过草稿箱

林立可 231

设计模式学习总结(19) 备忘录模式

本系列主要记录设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它;它是如何解决的,掌握它的结构图,记住它的关键代码;能够想到至少两个它的应用实例,一个生活中的,一个软件中的;这个模式的优缺点是什么,其有哪些使用场景,在使用时要注意什么。

hacke2' Blog 1844

《设计模式》19备忘录模式

19.备忘录模式 意在解决的问题: 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序可回溯到对象之前处于某点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。 如何实现对象状态的良好保存和回复?但同时又不会因此破坏对象本身的封装性。 模式原理 class Memo{ //该部分是简化的需要存储的状态 string state; public: Memo(const string &s):state(s){}

Nancy_fairy的博客 254
上一篇: 设计模式-18中介者模式
下一篇: 设计模式-20解释器模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值