备忘录模式

游戏角色状态恢复问题

 游戏角色有攻击力和防御力,在大战 Boss 前保存自 身的状态攻击力和防御力当大战 Boss 后攻击力和防御力下降, 从备忘录对象恢复到大战前的状态

 

传统方案

对象 <-> 对象状态
对象 <-> 对象状态
对象 <-> 对象状态

传统方式的问题分析

 1.一 个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象很多时,不利于管理,开销也很大
 2.传统的方式是简单地做备份(new 出另外一个对象出来),再把需要备份的数据放到这个新对象,但这就暴露了对象内部的细节

 

备忘录模式

 备忘录模式( Memento Pattern) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

 可以这里理解备忘录模式:现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作

 

备忘录模式结构

在这里插入图片描述

 1.原发器 (Originator) 类可以生成自身状态的快照, 也可以在需要时通过快照恢复自身状态。

 2.备忘录 (Memento) 是原发器状态快照的值对象 (value object)。 通常做法是将备忘录设为不可变的, 并通过构造函数一次性传递数据。

 3.负责人(Caretaker)仅知道 “何时” 和 “为何” 捕捉原发器的状态, 以及何时恢复状态。

 负责人通过保存备忘录栈来记录原发器的历史状态。 当原发器需要回溯历史状态时, 负责人将从栈中获取最顶部的备忘录, 并将其传递给原发器的恢复 (restoration) 方法。

在该实现方法中, 备忘录类将被嵌套在原发器中。 这样原发器就可访问备忘录的成员变量和方法, 即使这些方法被声明为私有。 另一方面, 负责人对于备忘录的成员变量和方法的访问权限非常有限: 它们只能在栈中保存备忘录, 而不能修改其状态。

 

备忘录模式适合应用场景

  1.当你需要创建对象状态快照来恢复其之前的状态时, 可以使用备忘录模式。

 2.当直接访问对象的成员变量、 获取器或设置器将导致封装被突破时, 可以使用该模式。

 

实现方式

  1. 确定担任原发器角色的类。 重要的是明确程序使用的一个原发器中心对象, 还是多个较小的对象。

  2. 创建备忘录类。 逐一声明对应每个原发器成员变量的备忘录成员变量。

  3. 将备忘录类设为不可变。 备忘录只能通过构造函数一次性接收数据。 该类中不能包含设置器。

  4. 如果你所使用的编程语言支持嵌套类, 则可将备忘录嵌套在原发器中; 如果不支持, 那么你可从备忘录类中抽取一个空接口, 然后让其他所有对象通过接口来引用备忘录。 你可在该接口中添加一些元数据操作, 但不能暴露原发器的状态。

  5. 在原发器中添加一个创建备忘录的方法。 原发器必须通过备忘录构造函数的一个或多个实际参数来将自身状态传递给备忘录。

    该方法返回结果的类型必须是你在上一步中抽取的接口 (如果你已经抽取了)。 实际上, 创建备忘录的方法必须直接与备忘录类进行交互。

  6. 在原发器类中添加一个用于恢复自身状态的方法。 该方法接受备忘录对象作为参数。 如果你在之前的步骤中抽取了接口, 那么可将接口作为参数的类型。 在这种情况下, 你需要将输入对象强制转换为备忘录, 因为原发器需要拥有对该对象的完全访问权限。

  7. 无论负责人是命令对象、 历史记录或其他完全不同的东西, 它都必须要知道何时向原发器请求新的备忘录、 如何存储备忘录以及何时使用特定备忘录来对原发器进行恢复。

  8. 负责人与原发器之间的连接可以移动到备忘录类中。 在本例中, 每个备忘录都必须与创建自己的原发器相连接。 恢复方法也可以移动到备忘录类中, 但只有当备忘录类嵌套在原发器中, 或者原发器类提供了足够多的设置器并可对其状态进行重写时, 这种方式才能实现。

 

备忘录模式优缺点

 优点:

  ✔️ 你可以在不破坏对象封装情况的前提下创建对象状态快照。

  ✔️ 你可以通过让负责人维护原发器状态历史记录来简化原发器代码。

 缺点:

  ❌ 如果客户端过于频繁地创建备忘录, 程序将消耗大量内存。

  ❌ 负责人必须完整跟踪原发器的生命周期, 这样才能销毁弃用的备忘录。

  ❌ 绝大部分动态编程语言 (例如 PHP、 Python 和 JavaScript) 不能确保备忘录中的状态不被修改。

 

解决游戏角色状态恢复问题

在这里插入图片描述

代码:

public class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }
}

public class GameRole {
    private String state; // 状态信息

    public String getState(){return state;}

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

    //保存状态对象Memento
    public Memento saveState(){
        return new Memento(state);
    }

    //恢复状态
    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }
}

public class Caretaker {
    //存放备忘录对象
    private List<Memento> mementoList = new ArrayList<>();

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

    //获取 所需下标 的 备忘录对象
    public Memento get(int index){
        return mementoList.get(index);
    }
}
public class Client {
    public static void main(String[] args) {
        GameRole gameRole = new GameRole();
        Caretaker caretaker = new Caretaker();

        gameRole.setState("状态1:攻击力100,防御力50");

        //保存状态1
        caretaker.add(gameRole.saveState());

        gameRole.setState("状态2:攻击力120,防御力60");
        //保存状态2
        caretaker.add(gameRole.saveState());

        gameRole.setState("状态3:攻击力150,防御力70");
        //保存状态3
        caretaker.add(gameRole.saveState());

        System.out.println("当前的状态为"+gameRole.getState());

        System.out.println("恢复状态1");
        gameRole.getStateFromMemento(caretaker.get(0));
        System.out.println("-->"+gameRole.getState());

        System.out.println("恢复状态3");
        gameRole.getStateFromMemento(caretaker.get(2));
        System.out.println("-->"+gameRole.getState());
    }
}

 备忘录模式的注意事项和细节
  1.给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
  2.实现了信息的封装,使得用户不需要关心状态的保存细 节
  3.如果类的成员变量过多,势必会占用比较大的资源 ,而且每一次保存都会消耗一定的内存 [需要注意]
  4.适用的应用场景: 1)后悔药。 2)打游戏时的存档。 3 )Windows 里的 ctrl+ z 。4 ) IE 中的后退。 5)数据库的事务管理
  5.为了节约内存 ,备忘录模式可以和原型模式配合使用

AI: 机器学习的模型是如何训练的?(在试错中学习) 一句话理解机器学习一般训练过程 :通过有标签样本来调整(学习)并确定所有权重Weights和偏差Bias的理想值。 训练的目标:最小化损失函数 (损失函数下面马上会介绍) 机器学习算法在训练过程中,做的就是:检查多个样本并尝试找出可最大限度地减少损失的模型;目标就是将损失(Loss)最小化 在这里插入图片描述 上图就是一般模型训练的一般过程(试错过程),其中 模型: 将一个或多个特征作为输入,然后返回一个预测 (y’) 作为输出。为了进行简化,不妨考虑一种采用一个特征并返回一个预测的模型,如下公式 阅读详情

相关推荐

3D坐标系转换实战:如何用Python快速实现旋转矩阵与平移向量的组合变换

本文详细介绍了如何使用Python和NumPy实现3D坐标系转换中的旋转矩阵与平移向量的组合变换。通过齐次坐标和变换矩阵的数学原理,结合代码示例,帮助开发者高效处理机器人路径规划和计算机视觉中的空间变换问题,并解决实际应用中的常见错误。

pluto的博客 959

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

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

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

Android 16(API 36)状态栏颜色适配全攻略:从沉浸式到自定义背景

本文全面解析Android 16(API 36)强制沉浸式状态栏带来的适配挑战,提供了从FrameLayout包裹法到动态修改Window背景色的核心解决方案。针对传统状态栏颜色设置失效问题,详细阐述了如何利用WindowInsets API实现自定义背景,并涵盖全屏模式、Fragment切换及第三方ROM兼容性等实战场景,为开发者提供一站式适配指南。

weixin_29227425的博客 594

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

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

小威的博客 2万+

VNC Viewer建立多个图形界面,来远程访问同一个服务器(Ubuntu)

如题。目前已经有了一个VNC viewer连接,那么如果再开一个图形界面呢? 思路主要是:新建一个用户,从这个用户新建一个vnc连接,然后访问图形界面。

the Blog of 等不到天亮丶等时光 5901

记一次Redis出问题及解决方案

Q1: redis服务关闭前确认数据还是在的,重启后发现一条数据都没了,key* 查也是空的 A1: 经仔细检查发现redis.conf配置文件配置的数据存储目录配置的是dir ./ 也就是相对目录,也就是说在哪个目录执行redis-server redis.config启动命令 redis数据就会存到哪个目录,同样就会加载哪个目录下的数据文件(dump.rdb),前后两次启动命令的位置不一样导致第二次启动没有加载到(dump.rdb)文件,从而导致查不出数据 Q2:springboot 集成r

u010013928的博客 3059

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

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

激流丶的博客 2985

基于PLC的冲压件自动生产线电气系统设计【附数据】

考虑到生产线的高效运行和维护简便性,选择了三菱FX系列的可编程逻辑控制器(PLC)作为核心控制单元,该型号的PLC因其高可靠性和强大的功能集,在工业自动化领域有着广泛的应用。最后,在完成初步的软件开发后,进行了多轮次的模拟测试和现场调试,逐步修正了存在的问题,最终达到了预期的功能要求。例如,对于进料环节,选用了光电传感器以精确检测物料的位置;此外,为了适应不同尺寸的工件加工需求,还特别设计了一套可调节的夹具系统,不仅提高了生产线的灵活性,同时也降低了更换模具的成本。✅ 感恩科研路上每一位志同道合的伙伴!

lagougongzuoshi的博客 1292

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

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

miaoyl的博客 2071

建立时间与保持时间

建立时间与保持时间的计算 文章目录1、建立时间与保持时间概述及模型2、寄存器之间数据传输时建立时间与保持时间3、寄存器之间数据传输时建立时间余量与保持时间余量计算4、 FPGA允许的最大时钟频率或最小时钟周期5、计算FPGA时钟所允许的最大频率或最小时钟周期6、违反建立和保持时间会发生什么? 1、建立时间与保持时间概述及模型 建立时间(Tsu): 在时钟采样之前,输入必须稳定一段时间,该时间量称为建立时间。 理想最优建立时间: 保持时间(Th): 在时钟沿之后输入到触发器稳定所需的最短时间。 理想最优

Crazzy_M的博客 3万+

[SV]SystemVerilog中,系统函数$cast()的作用是什么?

摘要:SystemVerilog中的$cast()系统函数用于安全的动态类型转换,主要在类层次结构中将父类句柄转换为子类句柄(向下转换)。它通过运行时类型检查确保转换合法性,成功时返回1并赋值句柄,失败则返回0。这种机制使得可以通过父类句柄访问子类特有成员,在多态场景(如UVM验证)中尤为重要。使用时需检查返回值处理转换失败情况。$cast()比静态转换更安全,但不能用于无关类或基本数据类型间的转换。

元直的博客 1211

备忘录模式(MementoPattern)

定义 在不破坏封装的前提下,捕获对象的内部状态,并在对象外存储这个内部状态,以便将来回滚到这一状态。 结构图 角色与理解 备忘录模式共分为三种种角色: Originator(原发器):需要被记录状态的类 Memento(备忘录):记录原发器状态的类,内部含有原发器的部分属性或者全部属性,不能被其他类所修改 Caretaker(管理者):管理备忘录 原发器创建备忘录记录此刻内部各属性的值,将备忘录交给管理者管理,回滚状态时,从管理者中获取备忘录,重置内部属性 核心代码 原发.

码农架构 523

基于STM32与FPGA的数据采集系统的设计与实现

数据采集系统在现代工程中起着至关重要的作用,用于实时获取和处理各种传感器或外部设备的数据。在本文中,我们将探讨如何基于STM32微控制器和FPGA(现场可编程门阵列)实现一个高效的数据采集系统。我们可以使用STM32的UART、SPI或I2C接口与各种传感器或外部设备进行通信,并通过GPIO口实现控制功能。在硬件连接完成后,我们可以通过STM32控制FPGA的配置和数据传输。STM32作为主控单元负责与外部设备进行通信和数据处理,而FPGA则用于高速数据采集和实时处理。具体的通信协议取决于连接的设备类型。

UbiSqlserver的博客 1797

设计模式——备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。【2】现实生活中备忘录是用来记录某些要去做的事情,或者是记录已经达成共同意见的事情,以防忘记。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作。【3】备忘录模式属于行为型模式。【4】实现了信息的封装,使得用户不需要关心状态和保存细节。符合 “单一职责原则”。

程序猿进阶 1709

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式-备忘录模式

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

技术人集结地 1617

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

重温设计模式之备忘录模式

备忘录模式 Memento Pattern 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 小明开披萨外卖店攒了一点钱,开始动心想开一家真正的西餐厅,不过这是一笔大投资,弄不好会赔掉全部积蓄,还要搭上时间。 如果人生失败后能重来就好了。 正在纠结的时候,忽然天上来了一位仙人,对他说: 孩子,你尽管大胆的去尝试吧,如果失败了,我来帮你回到现在。嗯,让我先保...

分享知识、分享进步 305

怀旧版电脑GBC模拟器

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

设计模式之-备忘录模式,快速掌握备忘录模式,通俗易懂的讲解备忘录模式以及它的使用场景

备忘录模式的核心思想是通过备忘录对象来存储和恢复对象的状态,以实现状态的保存和恢复功能。它的应用场景包括各种需要保存和恢复状态的情况,比如编辑器的撤销功能、游戏中的存档功能等。通过备忘录模式,我们可以在不破坏封装性的前提下,轻松实现对象状态的保存和恢复。

咖啡程序员 1780

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

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

蓝色的天空的博客 1200

备忘录模式介绍

备忘录模式在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。该模式提供了一种对象状态的撤销实现机制,当系统中某一个对象需要恢复到某一历史状态时可以使用备忘录模式进行设。今天我们就来介绍下备忘录设计模式。

qq_25409421的博客 1751

备忘录模式(Memento Pattern)

    备忘录模式又叫做快照模式或Token模式,是对象的行为模式。备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。 类图:   1、结构 2、备忘录模式的白箱实现 1)宽接口和白箱   2)“白箱”...

qq_26880671的博客 135

c语言课程设计忘备录报告,C语言:备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。介绍所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern),简单理解为对当前对象的状态进行备份,当使用时将...

weixin_39890431的博客 317

每天学习一个设计模式(十八):行为型之备忘录模式

一、基本概念 备忘录模式(Memento Pattern)提供了一种弥补真实世界缺陷的方法,让“后悔药”在程序的世界中真实可行,其定义如下:Without violating encapsulation,capture and externalize an object's internal state so that the object canbe restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对

简简单单的博客 1731

MementoPattern(备忘录模式)

/** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ private int lifeValue; private int grade; ...

weixin_30443895的博客 88

C++ 设计模式之备忘录模式

对于每个 "Increment" 和 "Decrement" 操作,输出当前计数器的值,计数器数值从0开始 对于每个 "Undo" 操作,输出撤销后的计数器值。输入包含若干行,每行包含一个字符串,表示计数器应用的操作,操作包括 "Increment"、 "Decrement"、"Undo" 和 "Redo"。备忘录有两个接⼝,发起⼈能够通过宽接⼝访问数据,管理者只能看到窄接⼝,并将备忘录传递给其他对象。UndoManager 和UndoableEdit 接⼝是与备忘录模式相关的主要类和接⼝。

K1_uestc的博客 2185

备忘录模式 MementoPattern

using System; public class NiceGirl { private string _Name; private string _Tall; private string _SkinColor; private string _HairColor; private string _Weight; privat...

feiliboos 82

从零开始学设计模式(十七): 备忘录模式(Memento Pattern)

**备忘录模式**(Memento Pattern)又叫快照模式,它指的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。它是一种对象行为型模式。

江夏、的博客 449
上一篇: 中介者模式
下一篇: 解释器模式
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值