设计模式学习——备忘录模式

Unity3D 设计模式学习之备忘录模式 备忘录模式(Memento)在游戏中可用来做存储功能。在书中使用备忘录模式”存储成就记录” 直接将数据存盘功能实现于游戏功能类中,一般来说不太理想,因为违反了单一职责原则(SRP)。也就是说,各个游戏功能类应该专心处理与游戏相关的功能。 而记录保存,也应交由专职的记录保存类 为说明要专门写一个记录保存类呢? 书中给出了解释说明: 如果在功能模块中实现,会将内部成员数据全部公开。 虽然可... 阅读详情



基本介绍

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

原理类图

在这里插入图片描述
对原理类图的说明-即(备忘录模式的角色及职责)

  1. Originator:对象(需要保存状态的对象)
  2. Memento:备忘录对象,负责保存好记录,即Originator内部状态
  3. Caretaker:守护者对象,负责保存多个备忘录对象,使用集合管理,提高效率。
  4. 说明:如果希望保存多个Orginator对象的不同时间的状态,也可以,只需要HashMap<String,集合>

原理代码

public class Originator {

    private String state;//状态信息

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    //编写一个方法,可以保存一个状态对象Memento
    //因此编写一个方法,返回Memento
    public Memento saveStateMemento() {
        return new Memento(state);
    }

    //通过备忘录对象,恢复状态
    public void getStateFromMemento(Memento memento){
        state= memento.getState();
    }
}
public class Memento {
    public String state;

    //构造器
    public Memento(String state) {
        super();
        this.state = state;
    }

    public String getState() {
        return state;
    }
}
public class Caretaker {

    //在List集合中会有很多备忘录对象
    private List<Memento> mementoList = new ArrayList<>();

    public void add(Memento memento) {
        mementoList.add(memento);
    }

    //获取到第index个Originator的备忘录对象(即保存状态)
    public Memento get(int index) {
        return mementoList.get(index);
    }
}
public class Client {

    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        originator.setState("状态#1 攻击力 100");
        //保存了当前的状态
        caretaker.add(originator.saveStateMemento());
        originator.setState("状态#2 攻击力 80");
        caretaker.add(originator.saveStateMemento());
        originator.setState("状态#3 攻击力 50");
        caretaker.add(originator.saveStateMemento());
        System.out.println("当前的状态是 =" + originator.getState());
        //希望恢复到状态#1
        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("恢复到状态#1:当前的状态是 =" + originator.getState());

    }
}

备忘录模式的实例类图

在这里插入图片描述

备忘录模式的实例代码

public class GameRole {

    private int vit;
    private int 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;
    }

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

    //从备忘录对象,恢复GameRole的状态
    public void recoverGameRole(Memento memento) {
        this.vit = memento.getVit();
        this.def = memento.getDef();
    }

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

    //攻击力
    private int vit;
    //防御力
    private int def;

    public Memento(int vit, int def) {
        super();
        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 Caretaker {

    //如果只保存一次状态
    private Memento memento;
    //对GameRole 保存多次状态
    private ArrayList<Memento> mementos;
    //对多个游戏角色保存多个状态
    //private HashMap<String, ArrayList<Memento>> rolesMmentos;


    public Memento getMemento() {
        return memento;
    }

    public void setMemento(Memento memento) {
        this.memento = memento;
    }
}
public class Client {
    public static void main(String[] args) {
        //创建游戏角色
        GameRole gameRole = new GameRole();
        gameRole.setVit(100);
        gameRole.setDef(100);

        System.out.println("和Boss大战前的状态");
        gameRole.display();

        //把当前状态保存caretaker
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(gameRole.createMenmento());

        System.out.println("和Boss大战~~~");
        gameRole.setVit(30);
        gameRole.setDef(30);
        gameRole.display();
        System.out.println("大战后,使用备忘录对象恢复到大战前");
        gameRole.recoverGameRole(caretaker.getMemento());
        gameRole.display();
    }
}

备忘录模式的注意事项和细节

  1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  2. 实现了信息的封装,使得用户不需要关心状态的保存细节
  3. 如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存,这个需要注意。
  4. 适用的应用场景,1、后悔药。2、打游戏时的存档。3、Windows里的Ctrl+z。4、IE中的后退。5、数据库的事务管理
  5. 为了节约内存,备忘录模式可以和原型模式配合适用。
深入解析6T SRAM的读写机制与性能优化 本文深入解析了6T SRAM的基本结构与核心工作原理,详细阐述了其读写操作的具体时序与机制。文章重点探讨了在先进工艺下面临的读写稳定性、写入能力等性能挑战,并系统介绍了写入辅助与读取辅助等关键优化技术,旨在提升SRAM的可靠性与整体性能。 阅读详情

相关推荐

机器学习(三) ----------线性回归算法(梯度下降+正则化)

线性回归算法在机器学习中具有核心地位,它以其简单性和直观性为基础,为理解数据间的关系提供了基本框架。作为许多复杂算法的基础,线性回归不仅用于预测目标变量,还用于解释自变量对目标的影响。同时,它也是机器学习入门的经典算法,对于推广机器学习知识和技术具有重要意义。

2301_77539454的博客 1868

备忘录模式

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

u011569827的博客 299

Hi3516CV610硬件设计避坑指南:从电源模块到DDR布线实战解析

本文深入解析了Hi3516CV610硬件设计中的关键难点与实战技巧。重点剖析了电源架构的选型陷阱与PCB布局要点,详细阐述了DDR3/L高速布线的等长匹配、信号完整性及端接策略,并提供了MIPI接口与时钟电路的隔离设计指南。旨在帮助工程师规避常见设计错误,提升系统稳定性与可靠性。

ooo22的博客 255

【设计模式】备忘录模式实例与代码分析

备忘录模式实例与代码分析,附有最详细的代码详情,让小白也能快速掌握,读这篇文章就够了。

weixin_51167671的博客 1185

YOLOv11改进,YOLOv11结合DynamicConv(动态卷积),CVPR2024,二次创新C3k2结构

DynamicConv(动态卷积)是一个用于提高卷积神经网络(CNN)性能的技术,核心思想是动态地生成卷积核(filter),而不是使用固定的卷积核。通过引入更多的计算灵活性和适应性来增强卷积操作的表达能力,进而提升模型的性能。专家选择:DynamicConv 通过引入多个“专家”(experts),每个专家学习特定的卷积模式。输入图像的不同部分会选择不同的专家进行卷积。动态卷积核生成:根据输入的不同特征,专家网络动态地生成卷积核,而不是使用固定的卷积核。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2263

UltraScale系列底层结构(3)——URAM概述

在UltraScale+™ 器件中,除了我们在常规熟悉的BRAM资源以外,还额外提供了URAM(UltraRAM)资源。 UltraRAM 是一种单时钟同步操作的高密度存储器,每个 UltraRAM 块可存储 288 Kb 数据,配置为 4K x 72 位的存储单元,其容量是 Block RAM 的八倍。虽然 UltraRAM 内部使用单端口存储单元,但通过在一个时钟周期内顺序执行端口 A 和端口 B 的操作,实现了双端口功能。

apple_53311083的博客 2833

23种设计模式——备忘录模式

备忘录模式(Memento)本质:保存和恢复内部状态

qq_51165184的博客 1469

android 9.0Settings休眠时间项(屏幕超时)添加永不休眠功能

在9.0的系统产品开发中,系统中默认息屏时间为1分钟,可以通过在Setting中的息屏时间选项设置对应的息屏时间,但是在开发平板类的产品中,需要实现永不休眠的功能,所以需要在Settings中的息屏时间中添加永不休眠时间这一项来实现这个功能,接下来看息屏时间的相关功能,来添加这个功能

安卓兼职framework和app工程师的博客 2056

简说设计模式——备忘录模式

一、什么是备忘录模式   备忘录这个词汇大家应该都不陌生,我就经常使用备忘录来记录一些比较重要的或者容易遗忘的信息,与之相关的最常见的应用有许多,比如游戏存档,我们玩游戏的时候肯定有存档功能,旨在下一次登录游戏时可以从上次退出的地方继续游戏,或者对复活点进行存档,如果挂掉了则可以读取复活点的存档信息重新开始。与之相类似的就是数据库的事务回滚,或者重做日志redo log等。   备忘录模式(Mem...

weixin_34099526的博客 223

【考试大纲】中级多媒体应用设计师考试大纲

中级多媒体应用设计师考试大纲

邓邓子的博客 382

腾讯面试——机器学习岗面试总结

先写合并两个有序数组,接着写合并n个有序的数组,假设总共m个数,讲了一个思路两两合并直到只剩下一个数组,分析一下时间复杂度(MlogN),面试官不满意,然后想了一下说了另一个思路,用n个指针开始指向各个数组的首端,用一个优先队列维护他们的最小值,每次拿出最小值的指针然后插入该指针的下一个值。感觉跟二面面试官聊得还是挺开心的,他详细地介绍了他们部门所做的业务,然后问了一下什么时候能来实现,我说只能暑假七八两个月,他觉得有点晚,这样子不利于转正,有些人都实习半年的,回去讨论一下,正式批之前给我答复。

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

备忘录模式的设计思想和案例实现【行为型】

备忘录模式的设计思想和案例实现

zjj_flower的博客 220

OpenClaw进阶实战(二十五):抖音企业号——私信回复与视频评论分析

本文介绍了抖音企业号自动化运营的技术方案,重点解决私信互动效率低和风控严格两大挑战。文章分析了抖音集成的三大技术壁垒(视频复杂性、风控体系、封闭API)并对比了三种技术路径的优缺点。针对不同规模的运营主体,推荐官方API+RPA混合架构或真机RPA+AI辅助的方案。 详细讲解了环境准备步骤,包括抖音Skill安装、Cookie获取和配置文件设置。核心实现部分展示了私信自动回复功能的安全合规实现,包含意图分类、优先级排序、延迟发送等防封禁机制,并提供了完整的Python代码示例。该方案通过模拟人工操作、限制日

PeterPan的博客 159

设计模式学习—备忘录模式(Memento Design Pattern)

设计模式之备忘录模式,行为型模式

闲鱼的博客 549

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

认真学习设计模式之备忘录模式(Memento Pattern)

认真学习设计模式之备忘录模式(Memento Pattern) 31/100 发布文章 J080624 未选择任何文件 new # 【1】概述 备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或

小小默:进无止境 780

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

尚硅谷设计模式学习(20)---[备忘录模式(Memento Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! ml备忘录模式 案例引入: 例如游戏中的玩家状态恢复: 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当打斗Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. 按照传统思路解决的话,创建一个对象,就得对应地创建它相应状态的对象,要是备份的数据量对象较多,过于复杂. 备忘录模式 捕获一个对象的内部状态,并在该对象之外保存这个状态.

从零开始的异世界JAVA学习 285

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

学习笔记【23种设计模式-第十九节:Memento Pattern 备忘录模式】

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

qq_53273362的博客 154

设计模式学习--20.备忘录模式(Memento Pattern)

package com.designepattern.mementopattern.v2; /** * @Author:glx * @Date:2020/12/10 * @Content: */ public class MainDemo { public static void main(String[] args) { Originator originator1=new Originator(); originator1.setSt...

u010031813的博客 147

学习设计模式《十八》——备忘录模式

备忘录模式的本质是【保存和恢复内部状态】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1464

备忘录模式 - 设计模式学习

备忘录模式 - 设计模式学习   备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。   以下给出备忘录模式的UML图:        Originato...

131

《Java设计模式学习》备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获对象的内部状态,并在该对象之外保存这个状态,以便以后可以将该对象恢复到先前的状态。备忘录模式基于三个核心组件:Originator(发起人)、Memento(备忘录)和Caretaker(管理器)。Originator负责创建一个备忘录对象,用于保存其内部状态。Memento是一个纯数据对象,它包含了Originator的内部状态。

一个不断前行的程序者 140

设计模式学习之备忘录模式

介绍 备忘录(Memento):在不破坏封装性的前提下,捕获- - 个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 Originator发起人角色 记录当前时刻的内部状态, 负责定义哪些属于备份范围的状态, 负责创建和恢复备忘录数据。 Memento备忘录角色 负责存储Originator发起人对象的内部状态, 在需要的时候提供发起人需要的内部状态。 Caretaker备忘录管理员角色 对备忘录进行管理、 保存和提供备忘录。 应用: 需要保存和恢复数

刘一儿(嵌入式) 393

【设计模式】备忘录模式学习小结

备忘录模式可以在不破坏封装的前提下存取当前对象的状态。这个当前的状态叫做"备忘录",或者"快照"。从定义上可以体会到,“快照” 对象本身应该是不可变的,存的是当前的状态,那么它不应该再暴露任何可以改变状态的方法。快照模式它可以解决的问题比如存储历史信息,撤销或回滚操作。比如如果你在业务逻辑里实现了一个“Transaction”,它需要时原子的,在中间步骤失败时,是要支持回滚操作,将状态复原的,此时就可以用到备忘录模式。

m0_69818080的博客 1011

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

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

qq_33129875的博客 1614

设计模式学习—14备忘录模式

备忘录模式 文章目录备忘录模式UML解释说明代码实现参考资料 UML 解释说明 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,之后可在需要的时候将对象恢复到原先保存的状态。 Originator:发起者;Memento:备忘录;Caretaker:管理者。 代码实现 Memento.class package learn14; publ...

Abfahrt的博客 190

设计模式之备忘录模式的学习思考

每个人都有写便签的习惯,其实这也是保存信息的一种方式,和备忘录差不多,都是提醒自己过去做过的事或者将来要做的事。备忘录模式(Memento Pattern)保存了一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于设计模式里的行为型模式。主要的实现形式其实很简单,为了不破坏封装性,我们再单独创建一个类来封装备份信息,然后再创建一个容器类,用来存放信息,以便今后的获取。代码和注释如下:impo

L-Study 454
上一篇: 设计模式学习——中介者模式
下一篇: 设计模式学习——解释器模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值