如果再回到从前——备忘录模式

news2024/9/28 14:19:56

文章目录

  • 如果再回到从前——备忘录模式
    • 如果再给我一次机会……
    • 游戏存进度
    • 备忘录模式
    • 备忘录模式基本代码
    • 游戏进度备忘

如果再回到从前——备忘录模式

如果再给我一次机会……

时间:5月6日18点  地点:小菜、大鸟住所的客厅  人物:小菜、大鸟

"小菜,今天上午看NBA了吗?"大鸟问道。

“没有,不过结果倒是在网上第一时间就知道了。”

“是呀,最后一分钟的失误,就等于输掉了整个赛季。”

"如果任何一人能抓到两个篮板中的一个,结果可能完全不是这样。真是遗憾呀。"小菜感慨道。

“很多时候我们做了件事后,却又后悔。这就是人类内心软弱的一面。时间不能倒流,不管怎么样人生是无法回到从前的,但是软件就不一样了。还记得玩一些单机的PC游戏的时候吗,通常我都是在打大Boss之前,先保存一个进度,然后如果通关失败了,我可以再返回刚才那个进度来恢复原来的状态,从头来过。从这点上说,我们比姚明强。”

“哈,这其中的原理是不是就是把当前的游戏状态的各种参数存储,以便恢复时读取呢?”

“是的,通常这种保存都是存在磁盘上了,以便日后读取。但对于一些更为常规的应用,比如我们下棋时通常悔棋、编写文档时需要撤销、查看网页时需要后退,这些相对频繁而简单的恢复并不需要存在磁盘中,只要将保存在内存中的状态恢复一下即可。”

“嗯,这是更普通的应用,很多开发中都会用到。”

“那我简单说个场景,你想想看怎么用代码实现。游戏的某个场景,一游戏角色有生命力、攻击力、防御力等数据,在打Boss前和后一定会不一样的,我们允许玩家如果感觉与Boss决斗的效果不理想可以让游戏恢复到决斗前。”

在这里插入图片描述

在这里插入图片描述

“好的,我试试看。”

游戏存进度

游戏角色类,用来存储角色的生命力、攻击力、防御力的数据。

在这里插入图片描述

客户端调用时:

在这里插入图片描述

“小菜,这样的写法,确实是实现了我的要求,但是问题也确实多多。”

“哈,你的经典理论,代码无错未必优。说吧,我有心理准备。”

“问题主要在于这客户端的调用。下面这一段有问题,因为这样写就把整个游戏角色的细节暴露给了客户端,你的客户端的职责就太大了,需要知道游戏角色的生命力、攻击力、防御力这些细节,还要对它进行’备份’。以后需要增加新的数据,例如增加’魔法力’或修改现有的某种力,例如’生命力’改为’经验值’,这部分就一定要修改了。同样的道理也存在于恢复时的代码。”

在这里插入图片描述

“显然,我们希望的是把这些’游戏角色’的存取状态细节封装起来,而且最好是封装在外部的类当中。以体现职责分离。”

备忘录模式

“所以我们需要学习一个新的设计模式——备忘录模式。”

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

备忘录模式(Memento)结构图:

在这里插入图片描述

■ Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。

■ Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。

■ Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。

“就刚才的例子,'游戏角色’类其实就是一个Originator,而你用了同样的’游戏角色’实例’备份’来做备忘录,这在当需要保存全部信息时,是可以考虑的,而用clone的方式来实现Memento的状态保存可能是更好的办法,但是如果是这样的话,使得我们相当于对上层应用开放了Originator的全部(public)接口,这对于保存备份有时候是不合适的。”

“那如果我们不需要保存全部的信息以备使用时,怎么办?”

“哈,对的,这或许是更多可能发生的情况,我们需要保存的并不是全部信息,而只是部分,那么就应该有一个独立的备忘录类Memento,它只拥有需要保存的信息的属性。”

备忘录模式基本代码

发起人(Originator)类:

在这里插入图片描述

管理者(Caretaker)类:

在这里插入图片描述

“哈,我明白了,这当中就是把要保存的细节给封装在了Memento中了,哪一天要更改保存的细节也不用影响客户端了。那么这个备忘录模式都用在一些什么场合呢?”

“Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。”

“我记得好像命令模式也有实现类似撤销的作用?”

“哈,小子记性不错,如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态[DP]。有时一些对象的内部信息必须保存在对象以外的地方,但是必须要由对象自己读取,这时,使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来[DP],从而可以恰当地保持封装的边界。”

“我感觉**可能最大的作用还是在当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原[DP]**这个作用吧?”

“说得好,这当然是最重要的作用了。”

“明白,我学会了。”

“别急,你还没有把你刚才的代码改成备忘录模式的。”

“啊,你就不打算饶过我。等着,看我来拿满分。”

游戏进度备忘

在这里插入图片描述

游戏角色类:

在这里插入图片描述

角色状态存储箱类:

在这里插入图片描述

客户端代码:

在这里插入图片描述

“看看,能不能得满分?我查了好几遍了。”

“不错,写得还行。你要注意,备忘录模式也是有缺点的,角色状态需要完整存储到备忘录对象中,如果状态数据很大很多,那么在资源消耗上,备忘录对象会非常耗内存。”

“嗯,明白。所以也不是用得越多越好。”

"小子,以后打游戏要记着用备忘录哦。"大鸟不忘提醒一句。

"哈,我一定会这样。"小菜开始装着深沉地说,“曾经有一个精彩的游戏摆在我的面前,但是我没有好好珍惜。等到死于Boss手下的时候才后悔莫及,尘世间最痛苦的事莫过于此。如果上天可以给我一个机会再来一次的话,我会对你说三个字,‘存进度’。如果非要把这个进度加上一个保险,我希望是刻成光盘,流传万年!”

如果对你有帮助,就一键三连呗(关注+点赞+收藏),我会持续更新更多干货~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2173773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sharding-JDBC笔记03-分库分表代码示例

文章目录 一、水平分库1. 将原有order_db库拆分为order_db_1、order_db_22. 分片规则修改分片策略standardcomplexinlinehintnone 3. 插入测试4. 查询测试5. 使用分库分片键查询测试总结 二、公共表1. 创建数据库2. 在Sharding-JDBC规则中修改3. 数据操作4. 字典操作测试5. 字典…

Linux线程-POSIX信号量与锁以及条件变量

POSIX信号量 POSIX没有元素这个概念相比于SYSTEM-V更简洁,POSIX不一定适用老版本;二者都是系统范畴,都需要手动删除,POSIX相关函数属于线程库,所有编译时需要末尾加上-lpthread选项 POSIX POSIX有名信号量 主要用于进…

华为 HCIP-Datacom H12-821 题库 (29)

🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.BFD 为确保两端系统都知道状态的变化,在BFD 状态机的建立和拆除时都采用三次握手…

【LeetCode:75. 颜色分类 + 快速排序】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

图像超分辨率(SR)

图像超分辨率(Image Super-Resolution, SR)是一种图像处理技术,旨在从低分辨率(LR)图像中恢复出高分辨率(HR)图像。这种技术通过增加图像中的细节和清晰度来提高图像的视觉质量,从而…

微信支付准备工作之内网穿透2024/9/28

微信支付部分好像做不了,但是跟着写了点东西。 做项目的微信支付功能时,微信后台需要调用到商户管理系统,但是我们的管理系统写在自己的电脑里。微信后台如何调用到商户系统?内网穿透。 还有如何保证调用过程数据安全&#xff1…

PowerDesigner 16.5安装教程 + 轻松解决软件证书过期导致的无法使用问题

目录 背景: 安装教程 : 证书过期的解决方法: 背景: PowerDesigner16.5凭借强大的功能集成、广泛的兼容性和高效的模型驱动开发方法成为了企业级建模于设计领域的佼佼者。无论是在企业信息化建设、软件开发项目还是数据库设计于管理等领域它都能提有利…

【步联科技身份证】 身份证读取与解析———未来之窗行业应用跨平台架构

一、身份证解析代码 C# function 身份证数据解析_湖南步联科技(wzxx) {var result {};result[xm] wzxx.substr(0, 15);result[xbdm] wzxx.substr(15, 1);result[mzdm] wzxx.substr(16, 2);result[csrq] wzxx.substr(18, 8);result[dzmc] wzxx.substr(26, 35);result[gms…

论文阅读 | HiDDeN网络架构

ECCV 2018 斯坦福-李飞飞团队 一、问题描述 受以下启发: 对抗性例子的发现:深度学习模型在图像识别任务中对微小的、难以察觉的输入扰动非常敏感,这些扰动可以导致模型错误分类图像。这一现象表明,神经网络可以在图像中编码信息&…

一文上手SpringSecurity【五】

对于前后端不分离的项目,我们可以采用一文上手SpringSecurity【四】当中的方式来自定义用户的登录页面和数据源,数据源目前采用的是模拟的方式来实现的,本篇内容主要介绍一下spring security对于前后端分离项目如何实现认证和授权的. 一、前后端分离的认证面对的问题 1.1 传统…

File systems

inode descriptor 文件系统中核心的数据结构就是inode和file descriptor。后者主要与用户进程进行交互。 inode,这是代表一个文件的对象,并且它不依赖于文件名。实际上,inode是通过自身的编号来进行区分的,这里的编号就是个整数…

修改 idea 的 Terminal 命令窗口使用 git-bash

修改配置方法 实际使用效果 (END)

Java Stream 神技!10招顶级技巧,让你的代码简洁又高效!

哈喽,欢迎来到【程序视点】,我是小二哥。 引言 你是否曾在编写Java代码时,为了处理集合而感到头痛不已?是否在寻找一种更优雅、更简洁的方式来简化你的代码? 如果你的答案是肯定的,那么Java Stream API无…

org.eclipse.paho.client.mqttv3.MqttException: 无效客户机标识

需求背景 最近有一个项目,需要用到阿里云物联网,不是MQ。发现使用原来EMQX的代码去连接阿里云MQTT直接报错,试了很多种方案都不行。最终还是把错误分析和教程都整理一下。 需要注意的是,阿里云物联网平台和MQ不一样。方向别走偏了。 概念描述 EMQX和阿里云MQTT有什么区别…

OpenCV视频I/O(6)检查视频捕获对象是否已成功打开的函数isOpened()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 如果视频捕获已经初始化,则返回 true。 如果之前调用 VideoCapture 构造函数或 VideoCapture::open() 成功,则该方法返回…

ireport 5.1 中文生辟字显示不出来,生成PDF报字体找不到

问题: 情况1:ireport中填入中文生辟字的时候不显示,或者无法输入和粘贴生辟字。 情况2:生成pdf的时候报字体找不到。 net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font : pdfFontName : …

十分钟实现内网连接,配置frp

十分钟实现内网连接,配置frp 一.frp是什么?其实是一款实现外网连接内网的一个工具,个人理解,说白了就像是teamviwer一样,外网能访问内网。 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服…

Python神经求解器去耦合算法和瓦瑟斯坦距离量化评估

🎯要点 神经求解器求解对偶方程,并学习两个空间之间的单调变换,最小化它们之间的瓦瑟斯坦距离。使用概率密度函数解析计算,神经求解器去耦合条件正则化流使用变量变换公式的生成模型瓦瑟斯坦距离量化评估神经求解器 &#x1f36…

CSS06-元素显示模式、单行文字垂直居中

一、什么是元素显示模式 1-1、块级元素 1-2、行内元素 1-3、行内块元素 1-4、小结 二、元素显示模式转换 三、单行文字垂直居中 CSS 没有给我们提供文字垂直居中的代码,这里我们可以使用一个小技巧来实现。 解决方案: 让文字的行高等于盒子的高度,就可…

普通二叉搜索树的模拟实现【C++】

二叉搜素树简单介绍 二叉搜索树又称二叉排序树,是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 注意…