18-备忘录模式

article/2025/11/11 17:09:05

文章目录

  • 游戏角色状态恢复问题
  • 备忘录模式基本介绍
  • 备忘录模式解决游戏角色状态回复问题
  • 备忘录模式的注意事项和细节

游戏角色状态恢复问题

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

传统方案
在这里插入图片描述
传统方案问题分析

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

备忘录模式基本介绍

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

原理类图
在这里插入图片描述
核心代码

/*** @ClassName Originator* @author: shouanzh* @Description 源对象* @date 2022/1/27 20:33*/
public class Originator {private String state;public String getState() {return state;}public void setState(String state) {this.state = state;}// 当前状态public Memento createMementor() {return new Memento(state);}public void revertStateFromMementor(Memento memento) {this.state = memento.getState();}}/*** @ClassName Memento* @author: shouanzh* @Description 备忘录对象* @date 2022/1/27 20:34*/
public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}}
/*** @ClassName Caretaker* @author: shouanzh* @Description 守护者对象 存放源数据* @date 2022/1/27 20:35*/
public class Caretaker {private List<Memento> mementoList = new ArrayList<>();// 保存当前状态public void addMemento(Memento memento) {mementoList.add(memento);}public Memento getMemento(Integer index) {return mementoList.get(index);}}/*** @ClassName Client* @author: shouanzh* @Description Client* @date 2022/1/27 20:36*/
public class Client {public static void main(String[] args) {// 源对象Originator originator = new Originator();// 守护者Caretaker caretaker = new Caretaker();originator.setState("当前状态:" + " 状态#1 血量 100 ");caretaker.addMemento(originator.createMementor());System.out.println(originator.getState());originator.setState("当前状态:" + " 状态#2 血量 80 ");caretaker.addMemento(originator.createMementor());System.out.println(originator.getState());originator.setState("当前状态:" + " 状态#3 血量 60 ");caretaker.addMemento(originator.createMementor());System.out.println(originator.getState());// 恢复到状态1originator.revertStateFromMementor(caretaker.getMemento(0));System.out.println("恢复状态:" + originator.getState());//当前状态: 状态#1 血量 100//当前状态: 状态#2 血量 80//当前状态: 状态#3 血量 60//恢复状态:当前状态: 状态#1 血量 100}}

备忘录模式中的角色和职责

  • Originator源对象:需要保存状态的对象
  • Memento备忘录对象:负责保存Originator内部状态
  • Caretaker守护者对象:负责存放多个Memento对象,使用集合管理,提高效率
  • 如果希望保存多个Originator对象的不同内部状态,也可以使用Map<String, List>

备忘录模式解决游戏角色状态回复问题

/*** @ClassName GameRole* @author: shouanzh* @Description 游戏角色* @date 2022/1/27 21:05*/
public class GameRole {private Integer vit;private Integer def;public Integer getVit() {return vit;}public void setVit(Integer vit) {this.vit = vit;}public Integer getDef() {return def;}public void setDef(Integer def) {this.def = def;}public Memento createMemento() {return new Memento(this.vit, this.def);}public void recoverMemento(Memento memento) {this.vit = memento.getVit();this.def = memento.getDef();}public void display() {System.out.println("游戏角色当前攻击力:" + this.vit + ",当前防御力:" + this.def);}}/*** @ClassName Memento* @author: shouanzh* @Description 备忘录对象* @date 2022/1/27 21:03*/
public class Memento {private Integer vit;private Integer def;public Memento(Integer vit, Integer def) {this.vit = vit;this.def = def;}public Integer getVit() {return vit;}public void setVit(Integer vit) {this.vit = vit;}public Integer getDef() {return def;}public void setDef(Integer def) {this.def = def;}}/*** @ClassName Caretaker* @author: shouanzh* @Description 守护者对象* @date 2022/1/27 21:04*/
public class Caretaker {private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}/*** @ClassName Client* @author: shouanzh* @Description Client* @date 2022/1/27 21:06*/
public class Client {public static void main(String[] args) {System.out.println("======大战前状态======");GameRole gameRole = new GameRole();gameRole.setVit(100);gameRole.setDef(100);Caretaker caretaker = new Caretaker();caretaker.setMemento(gameRole.createMemento());gameRole.display();System.out.println("======大战后状态======");gameRole.setVit(10);gameRole.setDef(10);gameRole.display();System.out.println("======从备忘录对象恢复到大战前的状态======");gameRole.recoverMemento(caretaker.getMemento());gameRole.display();//======大战前状态======//游戏角色当前攻击力:100,当前防御力:100//======大战后状态======//游戏角色当前攻击力:10,当前防御力:10//======从备忘录对象恢复到大战前的状态======//游戏角色当前攻击力:100,当前防御力:100}}

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

优点
给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点
如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存,这个需要注意。

适用的应用场景
后悔药
打游戏时的存档
Windows里的ctrl+z
IE中的后退
数据库的事务管理

为了节约内存,备忘录模式可以和原型模式配合使用​


http://chatgpt.dhexx.cn/article/3rxvhBMI.shtml

相关文章

详解设计模式:备忘录模式

详解设计模式&#xff1a;备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;也被称为快照模式&#xff08;Snapshot Pattern&#xff09;、Token 模式&#xff08;Token Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 备忘录模式…

JAVA设计模式--备忘录模式

目录 一、什么是备忘录模式 二、备忘录模式的结构 三、备忘录模式的适用性 四、备忘录模式的实现 五、备忘录模式的优缺点 六、总结 一、什么是备忘录模式 备忘录(Memento)模式又叫作快照(Snapshot)模式或Token模式&#xff0c;是一种对象的行为模式。在备忘录模式里&am…

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

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、备忘录模式是什么&#xff1f; 备忘录模式是一种行为型的软件设计模式&#xff0c;在不破坏封装的前提下&#xff0c;获取一个…

什么是备忘录模式?

一、定义 备忘录模式又称快照模式&#xff0c;或者令牌模式。是指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态&#xff0c;属于行为型模式。 二、通用写法及其uml 发起人角色&a…

行为型模式——备忘录模式(Memento Pattern)

文章目录 备忘录模式&#xff08;Memento Pattern&#xff09;什么是备忘录模式&#xff1f;UML角色应用使用模板 为什么要使用备忘录模式&#xff1f;优点&#xff1a;缺点&#xff1a; 怎样使用备忘录模式&#xff1f;在JDK中的使用 备忘录模式&#xff08;Memento Pattern&a…

备忘录模式

一、备忘录模式 1、定义 备忘录模式&#xff08;Memento Pattern&#xff09;又称作快照模式&#xff08;Snapshot Pattern&#xff09;&#xff0c;指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态。这样以后就可将该对象恢复…

设计模式系列----备忘录模式

一、什么是备忘录模式 备忘录这个词汇大家应该都不陌生&#xff0c;我就经常使用备忘录来记录一些比较重要的或者容易遗忘的信息&#xff0c;与之相关的最常见的应用有许多&#xff0c;比如游戏存档&#xff0c;我们玩游戏的时候肯定有存档功能&#xff0c;旨在下一次登录游戏时…

基于MIMO讲解信道估计基本原理

为什么要进行信道估计&#xff1f; 信号在通过信道传输的时候&#xff0c;会受到信道中种种因素产生的噪声以及可能发生的多径效应&#xff0c;弄清信号经过的信道的特性&#xff0c;表征信道的技术/过程称为信道估计&#xff08;Channel Estimation&#xff09;。 注&#xf…

m基于深度学习的OFDM信道估计和均衡算法误码率matlab仿真,对比了LS,MMSE以及LMMSE等传统的信道估计算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信的快速发展,5G正逐渐成长为支撑全社会各行业运作的大型基础性互联网络,其服务范围的大幅扩展对底层技术提出了诸多挑战,尤其是作为物理层关键技术之一的正交频分复用(Orthogonal Fre…

IRS的信道估计基础代码

一、 智能反射平面&#xff08;intelligent reflecting surfaces&#xff09;是一种被动反射表面&#xff0c;其具有的特性是可控制反射信号的相位。 明确IRS是可控制反射信号的相位&#xff0c;所以以单个智能反射单元为例&#xff0c;该单元可调信号的参数可表示为​&#xf…

信道估计算法

目前我所涉及的是短波宽带无线信道下的接收端的处理&#xff0c;包括捕获、同步、信道估计及信道均衡&#xff0c;还有译码。百度百科里是这样解释这种信道的&#xff1a;短波通信发射电波要经电离层的反射才能到达接收设备&#xff0c;通信距离较远&#xff0c;是远程通信的主…

信道估计之LS算法

信道估计之LS算法 前言LS信道估计的原理总结 前言 信道估计是通信系统接收机的重要功能模块&#xff0c;主要是用来估计信号所经历信道的冲击响应&#xff0c;并用于后续的信道均衡处理&#xff0c;以便消除多径信号混叠造成的ISI。 信道估计的方法有很多种&#xff0c;…

信道估计之LMMSE估计

之前的内容讲到了MMSE信道估计&#xff0c;并推导了基于MMSE优化准则的估计结果&#xff0c;该方法是对LS信道估计的进一步优化&#xff0c;适用于低信噪比场合&#xff0c;但由于其计算复杂&#xff0c;所以并不实用。因此又有了LMMSE信道估计方法&#xff0c;相对于MMSE估计&…

详解信道估计的发展与最新研究进展(MIMO)

目录 一. MIMO信道估计的重要性 二. 最经典的两种信道估计方法 2.1 最小二乘信道估计(LS) 2.2 最小均方误差信道估计(MMSE) 三. 优化传统的MIMO信道估计技术 四. 介绍压缩感知技术 五. 基于压缩感知的MIMO信道估计 5.1 压缩感知怎么用在MIMO信道估计 5.2 改进压缩感知…

c语言差分qpsk编码信道估计 pudn,请教一下OFDM中的信道估计

在AWGN信道中没有多径 这样信道估计和均衡对结果的影响有多少dB呢&#xff1f; 进行了一下仿真&#xff0c;没有加信道编码&#xff0c;用LS信道估计和一阶均衡 附件是仿真的误码率对比图&#xff0c;从图中可以看出均衡似乎对误码率有3dB的恶化 图中横轴是SNR 其中没有均衡的曲…

m基于机器学习MLP的OFDM信道估计误码率matlab仿真,对比LS和MMSE两种信道估计算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 信道估计器是接收机一个很重要的组成部分。在OFDM系统中&#xff0c;信道估计器的设计上要有两个问题:一是导频信息的选择&#xff0c;由于无线信道的时变特性&#xff0c;需要接收机不断对信道进…

OFDM通信系统的LS信道估计均衡算法matlab仿真

目录 一、理论基础 二、核心程序 三、仿真结论 一、理论基础 OFDM主要思想是&#xff1a;将信道分成若干正交子信道&#xff0c;将高速数据信号转换成并行的低速子数据流&#xff0c;调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开&#xff0c;…

MIMOl信道估计基本原理

为什么要进行信道估计&#xff1f; 信号在通过信道传输的时候&#xff0c;会受到信道中种种因素产生的噪声以及可能发生的多径效应&#xff0c;弄清信号经过的信道的特性&#xff0c;表征信道的技术/过程称为信道估计&#xff08;Channel Estimation&#xff09;。 所谓信道估计…

基于导频的信道估计实现

目录 零、前言 一、为什么要信道估计 二、导频的概念 &#xff08;1&#xff09;为什么要有导频 &#xff08;2&#xff09;导频在信道估计中作用 &#xff08;3&#xff09;关于导频序列的补充 三、最小二乘法估计 &#xff08;1&#xff09;LS信道估计算法分析 &…

DFT信道估计步骤及实例

在OFDM系统中&#xff0c;基于DFT的信道估计算法也经常被使用。DFT信道估计主要有以下几个步骤: (1)在实载波导频处&#xff0c;利用已知导频符号&#xff0c;使用LS信道估计算法计算得到实载波导频处信道频域响应&#xff1a;&#xff08;原理详见此处&#xff09; H ^ P _ A…