备忘录模式 - Unity
文章目录
- 备忘录模式
- 实现
- 应用场景
- 优缺点
- 与其他模式关系
备忘录模式
备忘录模式是对象行为型模式,也称快照模式,在不破坏封装性的前提下,捕获一个对象状态并保存,而且可以在需要的时候,进行还原。
在许多游戏里,我们都会有存档功能,在存档过程中进行状态保存。还有许多的软件都有撤销功能,除了对命令的储存,还有对当前状态的保存。
实现状态保存并不难,但我们需要对保存对象的字段进行保护的前提下,还可以对其进行保存。这就是黑箱。
这里使用 双接口 的形式来完成对不同类的访问。
双接口
- 窄接口:除了原发器以外的对象都是通过窄接口获得对象的,这个接口只能转移对象,无法对对象进行修改。
- 宽接口:与窄接口不同,宽接口可以访问对象中的所有信息,允许读取。
结构
说明
- 原发器(Originator) - 保护自身状态,且可以通过快照生成备忘录类来保存自身状态,也可以通过快照恢复自身状态。
- 备忘录(Memento) - 一个不可变的值对象(只读),通过构造创建新对象。保存一个快照。
- 负责人(Caretaker)- 负责记录快照,并保留,需要时进行发送快照给原发器进行恢复状态,可以管理快照,但无法修改。
- 窄接口(I Memento) - 作为标识符,没有任何方法,负责人通过窄接口(黑箱)来进行传递。
实现
保存游戏存档的功能
使用的是 SteamAssets文件夹
玩家信息类(原发器) 和 备忘录(嵌套)
public class PlayerInfo : MonoBehaviour{private FileSave _save;[SerializeField] private string _name;[SerializeField] private int _grade;[SerializeField] private int _attackForce;[SerializeField] private float _hp;private void Awake(){_save = new FileSave();}//负责人只和序列化的 Json 字符串打交道public void Save(){PlayerStateMemento memento = new PlayerStateMemento(_name, _grade, _attackForce, _hp);string json = JsonUtility.ToJson(memento, true);_save.Save(json);}public void Restore(){string json = _save.ReadArchive();PlayerStateMemento memento = JsonUtility.FromJson<PlayerStateMemento>(json);_name = memento.Name;_grade = memento.Grade;_attackForce = memento.AttackForce;_hp = memento.Hp;}//不可变类型,只读[Serializable]private class PlayerStateMemento{[SerializeField] private string _name;[SerializeField] private int _grade;[SerializeField] private int _attackForce;[SerializeField] private float _hp;public string Name => _name;public int Grade => _grade;public int AttackForce => _attackForce;public float Hp => _hp;public PlayerStateMemento(string name, int grade, int attackForce, float hp){_name = name;_grade = grade;_attackForce = attackForce;_hp = hp;}}}
文件保存类(负责人)
public class FileSave{private string _path;public FileSave(){CreateSaveFile();}public void Save(string json){File.WriteAllText(_path, json);}public string ReadArchive(){return File.ReadAllText(_path);}private void CreateSaveFile(){if (!string.IsNullOrEmpty(_path)) return;_path = Application.streamingAssetsPath;if (!Directory.Exists(_path))Directory.CreateDirectory(_path);_path = Path.Combine(_path, "Save.json");if (!File.Exists(_path))File.Create(_path);}}
通过两个按钮进行测试
读档成功,以下是 Json 文件
应用场景
- 当你需要记录对象的状态时,并且希望可以恢复之前的状态。
- 当你需要通过双接口来获得不同的访问权限时
优缺点
优点
- 可以在不破坏封装性的前提下,创建对象状态快照
- 可以维护快照,来还原之前的状态
缺点 - 过于频繁的创建快照,可能会消耗大量的内存
与其他模式关系
- 同时使用命令模式和备忘录模式来实现 撤销 的功能,在这种情况下,命令用于对象的操作,备忘录用于还原之前的状态。
在不支持嵌套类的语言中
我们可以使用两个接口来实现双接口操作
备忘录模式 - Unity相关推荐
- 设计模式之备忘录模式(Memento)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- java备忘录模式应用场景_图解Java设计模式之备忘录模式
图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...
- 设计模式(行为型模式)——备忘录模式(Memento)
2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类. 备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫 ...
- 《JAVA与模式》之备忘录模式
备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一 ...
- Python设计模式-备忘录模式
Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...
- 【设计模式】备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存 ...
- 备忘录模式(Memento)的原版与简化版实现
备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 适用场景: 1.保存一个对象在某一个时刻的(部分) ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
- php在线备忘录,备忘录模式(Memento)
namespace DesignPatterns\Behavioral\Memento\Tests; use DesignPatterns\Behavioral\Memento\Caretaker; ...
最新文章
- 正式环境docker部署hyperf_应用部署 - Docker Swarm 集群搭建 - 《Hyperf v1.1.1 开发文档》 - 书栈网 · BookStack...
- Android 自定义 spinner (背景、字体颜色)
- JAVA系统和DOMINO通过LDAP集成方
- 服务器网口和虚拟服务器网口配置,Apache服务器使用不同端口配置多个虚拟主机站点...
- PCL—关键点检测(rangeImage)低层次点云处理
- 大众伪原创软件 支持外链引蜘蛛 全自动操作
- python.集合转列表_python 列表,元组,字典,集合,字符串相互转换
- php当前页面删除处理,php删除记录同时刷新当前页面的实现代码
- paip.输入法编程---输入法ATIaN历史记录
- matlab离散信号幅频相频特性,信号幅频相频特性画法(频率响应法).pdf
- aid learning安装应用_aid learning更换源
- Qt 实现画线笔锋效果详细原理
- 马上跨年了,用Python带你看一场跨年烟花秀
- Android 一个简单的音乐播放器
- 单片机用c语言编写测量波形频率和占空比,单片机测量方波的频率、占空比及相位差的方法...
- Android开发之GPS测试完整案例源码详解之实时检测GPS的状态
- 很好用的壁纸网站源码分享,仅供学习,请勿商用。
- 学习项目---文件查重
- 情不知所起,无以而终
- 一个序列的子序列个数
热门文章
- android双清步骤,安卓刷机前双清如何操作?华为荣耀3C双清的过程
- OSI七层网络模型概念
- HDU 3364	 Lanterns 高斯消元(水 异或方程
- Floodlight模块简介
- 百度工程师首次现场演示:“文心千帆”如何可视化微调大模型
- FUNCTION 数据库名.GETDATE does not exist 详情页下单
- Kuuga——转化任何 Web 页面为桌面应用的跨平台工具
- Generator 函数的详解:
- 基于web的健身俱乐部网站系统的设计与实现
- Spirng Cloud 中gateway 网关限流和熔断