文章目录

  • 备忘录模式
    • 实现
    • 应用场景
    • 优缺点
    • 与其他模式关系

备忘录模式

备忘录模式是对象行为型模式,也称快照模式,在不破坏封装性的前提下,捕获一个对象状态并保存,而且可以在需要的时候,进行还原。

在许多游戏里,我们都会有存档功能,在存档过程中进行状态保存。还有许多的软件都有撤销功能,除了对命令的储存,还有对当前状态的保存。
实现状态保存并不难,但我们需要对保存对象的字段进行保护的前提下,还可以对其进行保存。这就是黑箱。

这里使用 双接口 的形式来完成对不同类的访问。

双接口

  • 窄接口:除了原发器以外的对象都是通过窄接口获得对象的,这个接口只能转移对象,无法对对象进行修改。
  • 宽接口:与窄接口不同,宽接口可以访问对象中的所有信息,允许读取。

结构

说明

  • 原发器(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相关推荐

  1. 设计模式之备忘录模式(Memento)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  2. java备忘录模式应用场景_图解Java设计模式之备忘录模式

    图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...

  3. 设计模式(行为型模式)——备忘录模式(Memento)

    2019独角兽企业重金招聘Python工程师标准>>> 本章讲讲第三类和第四类. 备忘录模式(Memento) 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫 ...

  4. 《JAVA与模式》之备忘录模式

    备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一 ...

  5. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  6. 【设计模式】备忘录模式

    备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存 ...

  7. 备忘录模式(Memento)的原版与简化版实现

    备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 适用场景: 1.保存一个对象在某一个时刻的(部分) ...

  8. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  9. php在线备忘录,备忘录模式(Memento)

    namespace DesignPatterns\Behavioral\Memento\Tests; use DesignPatterns\Behavioral\Memento\Caretaker; ...

最新文章

  1. 正式环境docker部署hyperf_应用部署 - Docker Swarm 集群搭建 - 《Hyperf v1.1.1 开发文档》 - 书栈网 · BookStack...
  2. Android 自定义 spinner (背景、字体颜色)
  3. JAVA系统和DOMINO通过LDAP集成方
  4. 服务器网口和虚拟服务器网口配置,Apache服务器使用不同端口配置多个虚拟主机站点...
  5. PCL—关键点检测(rangeImage)低层次点云处理
  6. 大众伪原创软件 支持外链引蜘蛛 全自动操作
  7. python.集合转列表_python 列表,元组,字典,集合,字符串相互转换
  8. php当前页面删除处理,php删除记录同时刷新当前页面的实现代码
  9. paip.输入法编程---输入法ATIaN历史记录
  10. matlab离散信号幅频相频特性,信号幅频相频特性画法(频率响应法).pdf
  11. aid learning安装应用_aid learning更换源
  12. Qt 实现画线笔锋效果详细原理
  13. 马上跨年了,用Python带你看一场跨年烟花秀
  14. Android 一个简单的音乐播放器
  15. 单片机用c语言编写测量波形频率和占空比,单片机测量方波的频率、占空比及相位差的方法...
  16. Android开发之GPS测试完整案例源码详解之实时检测GPS的状态
  17. 很好用的壁纸网站源码分享,仅供学习,请勿商用。
  18. 学习项目---文件查重
  19. 情不知所起,无以而终
  20. 一个序列的子序列个数

热门文章

  1. android双清步骤,安卓刷机前双清如何操作?华为荣耀3C双清的过程
  2. OSI七层网络模型概念
  3. HDU 3364 Lanterns 高斯消元(水 异或方程
  4. Floodlight模块简介
  5. 百度工程师首次现场演示:“文心千帆”如何可视化微调大模型
  6. FUNCTION 数据库名.GETDATE does not exist 详情页下单
  7. Kuuga——转化任何 Web 页面为桌面应用的跨平台工具
  8. Generator 函数的详解:
  9. 基于web的健身俱乐部网站系统的设计与实现
  10. Spirng Cloud 中gateway 网关限流和熔断