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

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

一.简介


今天来学习一下设计模式中的备忘录模式。说到这个模式,也许不太熟悉,不过相信写代码的时候,写错了之后,Ctrl+Z的功能用得还是比较多的,比如Word,Photoshop等编辑软件中,撤销功能都是必不可少的。而备忘录模式就是一个很好地实现撤销功能的一种设计模式。它可以让我们的系统恢复到之前的状态,嗯哼,传说中的月光宝盒!
下面看一下备忘录模式的定义以及UML类图:
 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

二.备忘录模式的例子


说到备忘录模式,在游戏中还是灰常有用的!传说中的SL大法(soave load)可是帮我打过了无数的游戏,每逢boss必存档也是我一直信奉的信条。这次,我们就来通过一个简单的游戏的例子来看一下备忘录模式的应用。
没有用备忘录模式的情况我就不说了,被Boss秒了之后,“大侠请重新来过”的时候发现没存档,后果不是删游戏就是摔键盘...
不多说,上代码,看一下备忘录模式的例子:
// Design Pattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;



//玩家存档类,备份,相当于模式中的Memento
class PlayerMemento
{
	//这里我们将其作为Player类的友元类,可以直接访问其private变量
	friend class Player;
private:
	int m_hp;  //血量
	int m_ATK; //攻击
	int m_DEF; //防御
public:
	PlayerMemento(int hp, int atk, int def)
		: m_hp(hp), m_ATK(atk), m_DEF(def)
	{

	}
};

//存档点,存储备忘录的地方,相当于Caretake
class CheckPoint
{
private:
	vector<PlayerMemento*> m_MementoVector;
public:
	//存档
	void Save(PlayerMemento* memento)
	{
		m_MementoVector.push_back(memento);
	}

	//根据存档编号获得存档
	PlayerMemento* Load(int num)
	{
		return m_MementoVector[num];
	}

	//表忘了清空对象
	void Clear()
	{
		for (vector<PlayerMemento*>::iterator it = m_MementoVector.begin(); it != m_MementoVector.end(); ++it)
		{
			delete *it;
		}
		m_MementoVector.resize(0);
	}
};

//玩家类,就是我们需要备份的类,相当于备忘录模式里面的Originator.
class Player
{
private:
	int m_hp;  //血量
	int m_ATK; //攻击
	int m_DEF; //防御
public:
	Player(int hp, int atk, int def)
		: m_hp(hp), m_ATK(atk), m_DEF(def)
	{

	}

	PlayerMemento* Save()
	{
		cout << "要去打Boss了,好紧张,存个档!" << endl;
		return new PlayerMemento(m_hp, m_ATK, m_DEF);
	}

	void Load(PlayerMemento* memento)
	{
		m_hp = memento->m_hp;
		m_ATK = memento->m_ATK;
		m_DEF = memento->m_DEF;
		cout << "哇咔咔,有存档,SL大法好!" << endl;
	}

	void Display()
	{
		cout << "当前生命: " << m_hp << " 当前攻击: " << m_ATK << " 当前防御: " << m_DEF << endl;
	}

	//受伤,减血
	void Hurt(int v)
	{
		m_hp -= v;
		if (m_hp <= 0)
		{
			m_hp = 0;
			cout << "OMG!我挂了!" << endl;
		}
			
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	//创建一个玩家对象,以及一个存档点对象
	Player* player = new Player(100, 200, 300);
	CheckPoint* checkPoint = new CheckPoint();
	player->Display();

	//每逢Boss必存档
	checkPoint->Save(player->Save());
	//受到10000点伤害,被boss秒了
	player->Hurt(10000);
	player->Display();

	//我有存档,我任性!
	player->Load(checkPoint->Load(0));
	player->Display();

	system("pause");
	

	return 0;
}
结果:
当前生命: 100 当前攻击: 200 当前防御: 300
要去打Boss了,好紧张,存个档!
OMG!我挂了!
当前生命: 0 当前攻击: 200 当前防御: 300
哇咔咔,有存档,SL大法好!
当前生命: 100 当前攻击: 200 当前防御: 300
请按任意键继续. . .

我们简单看一下上面的程序,玩家有一些属性字段,游戏的进程也是跟游戏中各个对象的状态属性有关,当然肯定比这个复杂得多。要想完全还原一个游戏进程,我们就需要恢复对象到之前的状态。我们给玩家建立了一个备忘录类,里面只是封装了玩家的相关属性字段,通过玩家的Save方法,创建出这样一个对象,保存了当前玩家的所有状态,存储到CheckPoint对象中,CheckPoint对象只有保存和根据需要获得存档的功能。当我们需要恢复对象状态时,只需要从checkpoint对象中获得备忘录对象,通过玩家的Load方法根据备忘录恢复原有属性。  


三.备忘录模式的总结


最后我们来看一下备忘录模式的优点缺点以及使用时机。
优点:
1)提供了一种对象状态恢复的机制,让我们可以在对象当前状态不对或者不符合预期时将对象恢复到之前备份时的状态,而且也可以是部分属性,不必所有字段都备份。
2)备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。
缺点:
如果存储的状态对象比较多或者状态属性较多时,可能会有较大的性能开销。
使用时机:
当我们有可能需要将对象状态恢复到某些时刻之前时,我们就可以考虑使用备忘录模式,比如撤销操作,游戏的存档之类的。
unity-23种常见设计模式unity版 总体来说设计模式分为三大类: 创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式:共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 立即下载

相关推荐

深入解析组合逻辑环(combinational loop)的成因与解决方案

本文深入解析了数字电路设计中组合逻辑环(combinational loop)的成因与危害。通过边沿检测和中断轮询(round_robin)仲裁器等实例,揭示了代码如何意外形成环路,并对比了插入触发器、重构逻辑以及状态机思维三种核心解决方案,帮助硬件工程师从根本上避免这一常见设计陷阱,确保电路稳定可靠。

weixin_28278377的博客 313

Unity 备忘录模式(实例详解)

Unity中的备忘录模式(Memento Pattern)主要用于保存和恢复对象的内部状态,而不会暴露对象的实现细节。以上示例覆盖了游戏实体、UI布局、动画控制器等多种不同场景下的备忘录模式应用。在实际项目中,根据需求调整备忘录类的具体内容以适应不同对象的状态存储和恢复。

qqrrjj2011的博客 752

ml307 二次开发

中移物联网旗下4g模组官方网站官方教程id=514官方客户不知道啥时候上班 早上10点也说不在服务时间内 找不到官方的sdk下载路径。

myWorld001的博客 2874

Unity 实现备忘录模式

备忘录模式的关键是将对象的状态封装到备忘录中,从而实现状态的存储和回滚,而不破坏对象的封装性。通过备忘录模式,Unity中的状态管理变得更加模块化和灵活,尤其在游戏开发中的存档/加载功能中非常实用。如果备忘录需要存储大量数据(如复杂的游戏状态),需要注意内存管理,定期清理过期的备忘录。可以将备忘录的数据序列化为JSON或XML文件,保存到磁盘,从而实现游戏的存档功能。如果数据比较敏感,可以对备忘录的访问进行限制,例如设置为只读或通过加密存储。确保备忘录存储的数据完全反映发起人的状态,避免数据不一致的问题。

小宝哥Code的专栏 1177

使用 ANSYS 实现铸造、凝固和熔炼的高级解决方案

凭借其强大的有限元分析 (FEA) 和计算流体动力学 (CFD) 功能,ANSYS 可以准确预测模具内的热和流体流动行为。总之,ANSYS 是铸件凝固和熔化领域的关键工具。其全面的仿真功能、工艺优化功能、材料特性分析和用户友好的界面使其成为旨在创新和改进制造工艺的工程师不可或缺的工具。通过利用 ANSYS,各行各业可以在铸造业务中实现更高的质量、效率和成本效益,从而为先进的制造解决方案铺平道路。ANSYS是一款领先的工程仿真软件,提供强大的功能来建模和优化这些复杂的热过程,从而显著提高生产效率和质量。

jkh920184196的博客 2108

STM32 HAL库定时器中断实现步进电机S型加减速控制与脉冲精准计数

本文详细介绍了如何使用STM32 HAL库定时器中断实现步进电机的S型加减速控制与脉冲精准计数。通过CubeMX配置定时器、计算PSC和ARR值,并结合S型曲线算法,实现平滑启停和精准定位。文章还提供了脉冲计数方案和常见问题排查技巧,帮助开发者优化步进电机控制性能。

weixin_29189363的博客 373

备忘录模式 - Unity

在许多游戏里,我们都会有存档功能,在存档过程中进行状态保存。还有许多的软件都有撤销功能,除了对命令的储存,还有对当前状态的保存。备忘录模式是对象行为型模式,也称快照模式,在不破坏封装性的前提下,捕获一个对象状态并保存,而且可以在需要的时候,进行还原。实现状态保存并不难,但我们需要对保存对象的字段进行保护的前提下,还可以对其进行保存。这里使用双接口的形式来完成对不同类的访问。使用的是SteamAssets文件夹。我们可以使用两个接口来实现双接口操作。在不支持嵌套类的语言中。通过两个按钮进行测试。...

有趣的博客 834

手把手教你用HiNet实现图像隐藏:可逆神经网络实战指南(附代码)

本文提供了一份基于HiNet框架实现图像隐藏的实战指南。通过详细解析可逆神经网络原理,手把手指导环境搭建、模型构建、损失函数设计及训练流程,并附有完整代码。该方法利用单个可逆网络统一隐藏与恢复过程,结合小波变换提升隐蔽性,为信息隐藏应用提供了高效解决方案。

rgv234567的博客 433

Unity备忘录模式

备忘录模式可以用来保存玩家在某一时刻的状态,比如玩家摔下悬崖死亡时,记录他最后一次离开地面的位置信息,用于复活时还原;也可以提前定义一份初始状态,作为玩家复活或重开的默认数据。除此之外,在玩家按下某个按键时保存背包数据、等级信息等,也同样适合使用备忘录模式,从而让玩家在下次进入游戏时能够继续之前的进度。

2301_76156790的博客 447

LPDDR5 学习笔记08:电气参数设计要求

本文详细阐述了LPDDR5内存接口的关键电气规范和时序要求。主要内容包括:1)绝对最大额定值限制及长期工作可靠性说明;2)差分时钟信号(CK/WCK)的输入电压、转换速率和交叉点电压规范;3)单端时钟信号的定义和测量方法;4)时钟周期、抖动(周期抖动、相邻周期抖动)和累积误差的精确计算方法;5)片选信号在同步/异步模式下的接收器规范;6)命令地址信号和数据信号的接收器掩模定义及脉冲宽度要求。所有参数均严格定义了测量条件和合规标准,为LPDDR5接口设计提供了完整的电气规范参考。

一只豌豆象的博客 1174

前端开发 - 完美解决video.js和flv.js视频同时播放数量限制的问题,即浏览器针对同一域名的请求限制问题(解决flv.js/video.js在页面播放最多不超过6个问题、浏览器并发请求限制数

flv.js,video.js,vue,reactive,uniapp,前端开发,flv视频同时播放有限制怎么办,浏览器限制多个视频同时播放怎么办,使用flv.js在前端播放,最多只能播放6个视频,突破浏览器域名并发限制,如何解决flvjs与videojs视频播放同时播放数量限制,video.js 一个页面同时播放多个视频的实例代码,解决网页视频最大只能播放6路的问题,浏览器只能播放6路http-flv流的解决方法,一个浏览器播放5个或者6个flv的视频就不能播放了,video.js 无法在页面同时播放多个

✅ 精选推荐文章 4994

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

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

qq_53273362的博客 154

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

设计模式学习笔记——18 备忘录模式

备忘录模式 备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 优点: 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。 本模式简化了发起人类。发起人不再需要管...

GM. 203

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战boss前保存自身状态,当大战boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态 传统方案解决 一个对象,就对应一个保存对象状态的对象,这样不利于管理,开销很大 传统的方式是简单的做备份,new出另一个对象,再把需要备份的数据放到这个新对象,但是这就暴露了对象内部细节 备忘录模式 基本介绍 备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将对象回复到原先保存的状态 备忘录对象主要用来记录

我不是什么好人 292

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式学习笔记---备忘录模式memento pattern(Java版)

一、场景 录入大批人员资料,当正在录入当前人资料时,发现上一个人录错了 此时需要恢复上一个人的资料,再进行修改。 Word文档编辑时,忽然电脑死机或断电,再打开时可以看到word 提示你恢复到以前的文档。 管理系统中,公文撤回功能。公文发送出去后,想撤回来。二、核心 保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。 结构: 一源发器类originator 一备忘

吃果冻不吐果冻皮 1246

【设计模式学习笔记】备忘录模式

备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。  文章目录 1.1 首先改造我们的车 1.2 备份 1.3 备忘录 1.4 恢复 1.5 结果 参考 最近我们车厂决定要扩建一个维修厂,这个维修厂可以让让用户的车恢复到之前的任意状态。是不是很牛?! 1.1 首先改造我们的车 package memento; /**********...

Roger_CoderLife的博客 217

《设计模式》学习笔记——备忘录模式

        备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。意图:     在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。主要解决:     所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。     这样可以在以后将对象恢复到原先保存的状态。何时使用...

smallerxuan的博客 1955

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

备忘录模式的应用场景,可以想一下游戏存档。备忘录模式主要由三部分组成:原发器(Originator)、备忘录(memento)、Caretaker(负责人)。其中:原发器:相当于游戏,可以创建备忘录,使用备忘录;备忘录:相当于存档负责人:存储备忘录。只负责存储,但不能操作备忘录。通常用数组存储一系列备忘录。

左直拳的马桶_日用桶 2384

c++设计模式之备忘录模式 学习笔记

先说一下定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 举一个几乎所有人都深有体会的例子:游戏进度的保存。比如我最近玩的生存游戏******,里面人物有:生命值,饥饿值,体力值。背包里还有各种物品。为了避免人物死掉丢失数据,我们会时不时的保存一下。这里面保存的就是当时的人物数据,可以用到备忘录模式。 介绍一下备忘录模式在游戏保存这个例子中都有哪几个类:人物类(就是游戏里的人物,该类拥有游戏中的人物中的所有属性和东西),保存内容类(该类中封装了需要保存的人物类中的内容),保

超级无敌大泡泡的博客 173

设计模式学习笔记20 - Java版之备忘录模式

文章目录1. 需求2. 传统方案2.1 方案2.2 分析3. 备忘录模式3.1 基本介绍3.2 原理类图3.3 实际应用3.4 细节 1. 需求 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态 2. 传统方案 2.1 方案 2.2 分析 一个对象,就对应一个保存对象状态的对象, 这样当我们游戏的对象...

liyang_007的博客 494

设计模式学习笔记(二十)备忘录模式

原发器类(Originator)1、原发器类是需要保存状态并支持状态恢复的对象。2、原发器类具有访问和修改内部状态的方法,并能够创建备忘录对象来保存当前状态或从备忘录对象中恢复之前的状态。当原发器需要保存状态时,它会创建一个备忘录对象,并将自己的状态传递给备忘录对象,使其保存。当需要恢复到之前的某个状态时,原发器可以从备忘录对象中获取相应的状态值,并将其设置为当前状态。备忘录类(Memento)1、备忘录类是用于存储原发器对象的内部状态。

weixin_44917291的博客 305

【学习笔记】设计模式-备忘录模式(Memento)

文章目录0 设计模式1 备忘录模式2 实现思路3 需要的类4 具体实现4.1 Memento(备忘录)4.2 Originator(目标对象)4.3 CareTaker(管理者)4.4 测试类5 思维导图6 示例源码地址最后 0 设计模式 不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式 https://blog.youkuaiyun.com/qq_42874315/article/details/120006447 1 备忘录模式 备忘录模式主要的作用是保存一个对象的某个状态,以便在适当的时候恢复对象。备

五条的博客 660
上一篇: UML类图符号
下一篇: AR技术资料汇总
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值