(二 十 二)趣学设计模式 之 备忘录模式!

news2025/3/9 10:28:47

在这里插入图片描述

目录

    • 一、 啥是备忘录模式?
    • 二、 为什么要用备忘录模式?
    • 三、 备忘录模式的实现方式
    • 四、 备忘录模式的优缺点
    • 五、 备忘录模式的应用场景
    • 六、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解访问者模式请看: (二 十 一)趣学设计模式 之 访问者模式!
✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的备忘录模式

一、 啥是备忘录模式?

想象一下,你在玩一个游戏 🎮,你打到了一个很高的分数,但是你怕后面会失误,导致分数降低 📉。 这时候,你可以保存一个游戏存档 💾,这样即使你后面失误了,也可以读档回到之前的状态 🕹️。

备忘录模式,就是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态! 简单来说,就是给对象做一个“快照”,方便以后恢复 📸。

简单来说,就是给对象创建一个“存档点”,以便在需要的时候可以“读档重来”! 💾+🕹️

  • 你需要保存一个对象的内部状态,以便以后可以恢复: 就像你需要保存游戏存档,以便在失误后可以读档 🎮!
  • 你不想破坏对象的封装性: 就像你不想直接访问游戏内部的数据,而是通过存档来保存状态 💾!
  • 你需要支持撤销操作: 就像你需要支持游戏中的“悔棋”功能 🔙!

二、 为什么要用备忘录模式?

用备忘录模式,好处多多 👍:

  • 保存状态: 可以保存对象的内部状态,方便以后恢复 💾!
  • 保护封装性: 不破坏对象的封装性 🔒!
  • 支持撤销: 可以支持撤销操作 🔙!
  • 简化对象: 可以将复杂的对象状态存储到备忘录中,简化对象本身 🧘!

三、 备忘录模式的实现方式

备忘录模式主要包含以下几个角色:

  • 发起人(Originator): 创建备忘录,并使用备忘录恢复自身状态 🕹️。
  • 备忘录(Memento): 存储发起人的内部状态 💾。
  • 管理者(Caretaker): 负责保存备忘录,但不检查备忘录的内容 📦。

代码示例:

// 备忘录:游戏存档
class GameMemento {
    private int score; // 分数
    private int level; // 关卡

    public GameMemento(int score, int level) {
        this.score = score;
        this.level = level;
    }

    public int getScore() {
        return score;
    }

    public int getLevel() {
        return level;
    }
}

// 发起人:游戏角色
class GameRole {
    private int score; // 分数
    private int level; // 关卡

    public GameRole(int score, int level) {
        this.score = score;
        this.level = level;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    // 创建备忘录
    public GameMemento createMemento() {
        return new GameMemento(score, level);
    }

    // 从备忘录恢复状态
    public void restoreMemento(GameMemento memento) {
        this.score = memento.getScore();
        this.level = memento.getLevel();
    }

    // 显示游戏状态
    public void display() {
        System.out.println("当前分数:" + score + ",当前关卡:" + level);
    }
}

// 管理者:存档管理器
class Caretaker {
    private GameMemento memento; // 备忘录

    public GameMemento getMemento() {
        return memento;
    }

    public void setMemento(GameMemento memento) {
        this.memento = memento;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        GameRole gameRole = new GameRole(1000, 5); // 创建游戏角色
        gameRole.display(); // 显示游戏状态

        Caretaker caretaker = new Caretaker(); // 创建存档管理器
        caretaker.setMemento(gameRole.createMemento()); // 保存游戏存档

        gameRole.setScore(500); // 游戏失误,分数降低
        gameRole.setLevel(3); // 关卡降低
        gameRole.display(); // 显示游戏状态

        gameRole.restoreMemento(caretaker.getMemento()); // 读档
        gameRole.display(); // 显示游戏状态
    }
}

分析:

  • GameMemento 是备忘录,存储了游戏角色的分数和关卡。
  • GameRole 是发起人,可以创建备忘录,并使用备忘录恢复自身状态。
  • Caretaker 是管理者,负责保存备忘录。

输出结果:

当前分数:1000,当前关卡:5
当前分数:500,当前关卡:3
当前分数:1000,当前关卡:5

四、 备忘录模式的优缺点

优点:

  • 保存状态 💾!
  • 保护封装性 🔒!
  • 支持撤销 🔙!
  • 简化对象 🧘!

缺点:

  • 增加了存储成本(需要存储备忘录) 💰!
  • 管理备忘录可能会比较复杂 📦!

五、 备忘录模式的应用场景

  • 需要保存一个对象的内部状态,以便以后可以恢复: 就像你需要保存游戏存档,以便在失误后可以读档 🎮!
  • 需要支持撤销操作: 就像你需要支持游戏中的“悔棋”功能 🔙!
  • 需要在事务管理中实现回滚操作: 就像数据库事务需要支持回滚操作 🔄!
  • 需要在编辑器中实现撤销/重做功能: 就像 Word 编辑器需要支持撤销/重做功能 📝!

六、 总结

  • 备忘录模式就像给对象创建一个“存档点”,以便在需要的时候可以“读档重来”! 💾+🕹️
  • 优点是保存状态、保护封装性、支持撤销、简化对象! 👍
  • 缺点是增加存储成本、管理备忘录复杂! 👎
  • 适用于需要保存对象状态,并支持撤销操作的场景! 🎯

希望这篇文章能让你彻底理解备忘录模式! 💯 祝你学习愉快! 😄
看完请看:(二 十 三)趣学设计模式 之 解释器模式!

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

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

相关文章

conda 配置新环境时package will be install 和 package will be download 的区别

install 和 download 的区别 package will be downloaded下的包:这一类显示的是需要从 conda 仓库或其他指定的源下载的软件包。这些软件包通常是 .tar.bz2、.tar.xz 或 .conda 格式的压缩包。这些包会被下载到本地缓存目录(通常是 ~/.conda 或 C:\Users…

第本章:go 切片

注意: 切片必须要初始化 才能使用 ,切片是引用类型 a :[]int{} // 这上叫始化 此时并没有申请内存 // 如果要追加值的话: append ints : append(a, 1, 2, 3)a : make([]int,5) // 声明切片类型var a []string //声明一…

关于AI数据分析可行性的初步评估

一、结论:可在部分环节嵌入,无法直接处理大量数据 1.非本地部署的AI应用处理非机密文件没问题,内部文件要注意数据安全风险。 2.AI(指高规格大模型)十分适合探索性研究分析,对复杂报告无法全流程执行&…

编程考古-Borland历史:《.EXE Interview》对Anders Hejlsberg关于Delphi的采访内容(中)

为了纪念Delphi在2002年2月14日发布的25周年(2020.2.12),这里有一段由.EXE杂志编辑Will Watts于1995年对Delphi首席架构师Anders Hejlsberg进行的采访记录。在这次采访中,Anders讨论了Delphi的设计与发展,以及即将到来的针对Windows 95的32位版本。 Q. 编译器引擎本身是用…

Manus+Ollama实现本地大模型部署和应用测试

这几天Manus即DeepSeek后又突然火爆,我也进行了跟踪测试,特记录一下分享给大家,目前来看,Manus的确是一个可以进行任务分解的自动化解决方案,将其他AI需要多次繁杂的迭代对话做了较大的改进,相当于用户抛出…

【Python 数据结构 9.树】

我装作漠视一切,其实我在乎的太多,但我知道抓得越紧越容易失去 —— 25.3.6 一、树的基本概念 1.树的定义 树是n个结点的有限集合,n0时为空树。当n大于0的时候,满足如下两个条件: ① 有且仅有一个特定的结点&#xff…

LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)

文章目录 LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)Self-Attention (自注意力机制)结构多头注意力 EncoderAdd & Norm 层Feed Forward 层 EncoderDecoder的第一个Multi-Head AttentionMasked 操作Teacher Fo…

计算机网络软考

1.物理层 1.两个主机之间发送数据的过程 自上而下的封装数据,自下而上的解封装数据,实现数据的传输 2.数据、信号、码元 码元就是数字通信里用来表示信息的基本信号单元。比如在二进制中,用高电平代表 “1”、低电平代表 “0”&#xff0c…

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案

目的,判断是否主键重复,不重复则登录新数据,重复则不登录。 定义类型: DataRecord   tableName 表名   rowNumber 行号   columnName 列名   data 数据 想要实现的代码逻辑如下: 模拟数据库的登录过程。假设…

2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB

一、山羊优化算法 山羊优化算法(Goat Optimization Algorithm, GOA)是2025年提出的一种新型生物启发式元启发式算法,灵感来源于山羊在恶劣和资源有限环境中的适应性行为。该算法旨在通过模拟山羊的觅食策略、移动模式和躲避寄生虫的能力&…

网络基础(一)【网络发展/认识协议/网络 VS 系统/以太网通信原理/重谈协议/网络中的地址管理】

网络基础(一) 1. 网络的发展2. 认识协议3. 网络 VS 系统4. 以太网通信原理5. 重谈协议6. 网络中的地址管理 1. 网络的发展 最开始时,计算机之间相互独立。 但是为了协作完成一些任务,就产生了计算机之间相互通讯的需求&#xff0c…

学习threejs,Animation、Core、CustomBlendingEquation、Renderer常量汇总

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Animation常量汇总1.1.1 循…

常用无功功率算法的C语言实现(二)

0 前言 尽管数字延迟法和积分移相法在不间断采样的无功功率计算中得到了广泛应用,但它们仍存在一些固有缺陷。 对于数字延迟法而言,其需要额外存储至少1/4周期的采样点,在高采样频率的场景下,这对存储资源的需求不可忽视。而积分移相法虽然避免了额外的存储开销,但为了抑制…

易基因特异性R-loop检测整体研究方案

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 01.技术简述 R-loop是由DNA:RNA 杂交体和被置换的单链DNA组成的三链核酸结构,广泛参与基因转录、表观遗传调控及DNA修复等关键生物学过程。异常的R-loop积累会导致基因组不稳…

装饰器模式--RequestWrapper、请求流request无法被重复读取

目录 前言一、场景二、原因分析三、解决四、更多 前言 曾经遇见这么一段代码,能看出来是把request又重新包装了一下,核心信息都不会改变 后面了解到这叫 装饰器模式(Decorator Pattern) :也称为包装模式(Wrapper Pat…

STM32-I2C通信协议

目录 一:什么是I2C通信协议 二:I2C通信 三:I2C时序图 四:面试常见问题 一:什么是I2C通信协议 I2C(Inter-Integrated Circuit)协议是一种串口通信协议,用于在集成电路之间传输数…

Unity开发——CanvasGroup组件介绍和应用

CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染顺序的组件。 一、常用属性的解释 1、alpha:控制UI的透明度 类型:float,0.0 ~1.0, 其中 0.0 完全透明,1.0 完全不透明。 通过调整alpha值可以实现UI的淡入淡…

DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!

从央视到地方媒体,已有多家媒体机构推出AI主播,最近杭州文化广播电视集团的《杭州新闻联播》节目,使用AI主持人进行新闻播报,且做到了0失误率,可见AI正在逐渐取代部分行业和一些重复性的工作,这一现象引发很…

C语言100天练习题【记录本】

C语言经典100题(手把手 编程) 可以在哔哩哔哩找到(url:C语言经典100题(手把手 编程)_哔哩哔哩_bilibili) 已解决的天数:一,二,五,六,八&#xf…

DeepSeek【部署 03】客户端应用ChatBox、AnythingLLM及OpenWebUI部署使用详细步骤

DeepSeek客户端应用 1.ChatBox2.AnythingLLM3.OpenWebUI4.总结 客户端软件提供可视化的模型及参数配置,人性化的对话窗口及文件上传功能,大大降低了大模型的使用门槛。 1.ChatBox Chatbox AI 是一款 AI 客户端应用和智能助手,支持众多先进的…