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

在这里插入图片描述

目录

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

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解访问者模式请看: (二 十 一)趣学设计模式 之 访问者模式!
✨更多请看个人主页: 码熔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 编辑器需要支持撤销/重做功能 📝!

六、 总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能

20250307确认荣品PRO-RK3566开发板在Android13下的以太网络共享功能 2025/3/7 13:56 缘起:我司地面站需要实现“太网络共享功能”功能。电脑PC要像连接WIFI热点一样连接在Android设备/平板电脑上来实现上网功能/数据传输。 Android设备/平板电脑通过4G/WIFI来上网。…

HMC7043和HMC7044芯片配置使用

一,HMC7043芯片 MC7043独特的特性是对14个通道分别进行独立灵活的相位管理。所有14个通道均支持频率和相位调整。这些输出还可针对50 Ω或100 Ω内部和外部端接选项进行编程。HMC7043器件具有RF SYNC功能,支持确定性同步多个HMC7043器件,即确保所有时钟输出从同一时钟沿开始…

RSA的理解运用与Pycharm组装Cryptodome库

1、RSA的来源 RSA通常指基于RSA算法的密码系统,令我没想到的是,其名字的来源竟然不是某个含有特别意义的单词缩写而成(比如PHP:Hypertext Preprocessor(超文本预处理器)),而是由1977年提出该算法的三个歪果…

嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)

目录 一、根文件系统的原理与重要性 二、根文件系统的构成 2.1. 基本目录结构 2.2. 核心组件 2.3. 设备驱动 2.4. 网络工具和协议 2.5. 调试工具 三、根文件系统的制作方法 四、根文件系统的测试 五、构建根文件系统的关键技术 5.1. 最小化构建工具 5.2. 关键配置文…

SpringBoot知识点及其源码解析(1)

自动配置 以web启动器为例,在spring-boot-starter-test-3.4.3.pom文件整合了一系列的依赖,那么当启动程序后会不会进行自动配置?当获取到这个容器后,可以从容器中获取所有bean的名字,此时就可以在控制台发现很多bean的…

网络安全配置截图 网络安全i

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全:Cyber Security(网络空间安全) 网络空间有独立且相互依存的信息基础设施和网络组成,包括互联网、电信网、计算机系统、嵌入式处理器和控…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

第六课:数据存储三剑客:CSV/JSON/MySQL

在Python的数据存储与处理领域,CSV、JSON和MySQL被广大开发者誉为“数据存储三剑客”。它们各自在不同的场景下发挥着重要作用,无论是简单的数据交换、轻量级的数据存储,还是复杂的关系型数据库管理,都能找到它们的身影。本文将详…

CSS设置文字渐变色样式(附带动画效果)

最近用DeepSeek问了一下如何使用css设置文字的渐变色效果,并且希望可以有动画效果,然而DeepSeek给出的答案动画效果有些bug,于是自己动手改了改。 下面是CSS样式设置代码 .gradient-text {background-image: linear-gradient(to right, #ff6…

三维建模与视频融合(3D-Video Integration)技术初探。

三维建模与视频融合(3D-Video Integration)是一种将虚拟三维模型无缝嵌入实拍视频场景的技术,广泛应用于影视特效、增强现实(AR)、游戏开发、广告制作 、视频监控 等领域。 一、技术核心流程 三维建模与动画 使用工具…

electron + vue3 + vite 主进程到渲染进程的单向通信

用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目:https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程(单向) 以Electron官方文档给出的”主进程主动触发动作,发送内容给渲…

第八节:基于Winform框架的串口助手小项目---完结优化《C#编程》

C# 实战串口助手完成! ----------------------------不竭余力,方能成长!-----------WHAPPY 源码:我会分享开源平台,可以艾特me!(2025/3/5)时间紧张任务中! 文章上所说的…

SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)

文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 WebsocketConfig.java2.7 AiChatWebSocketHandler.java2.8 SaveChatSessionParamRequest.java2.9 index.html 三、页面调试3.1 主页…

计算机视觉之dlib人脸关键点绘制及微笑测试

dlib人脸关键点绘制及微笑测试 目录 dlib人脸关键点绘制及微笑测试1 dlib人脸关键点1.1 dlib1.2 人脸关键点检测1.3 检测模型1.4 凸包1.5 笑容检测1.6 函数 2 人脸检测代码2.1 关键点绘制2.2 关键点连线2.3 微笑检测 1 dlib人脸关键点 1.1 dlib dlib 是一个强大的机器学习库&a…

进程控制 ─── linux第15课

目录 进程控制 1.进程创建 fork函数 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出的场景 退出码 ​编辑 进程终止的方法 _exit函数 exit函数 exit与_exit 进程等待 进程等待必要性 进程等待的方法(wait 和waitpid) 阻塞非阻塞问题 ​编辑 非…

Kubernetes 的正式安装

1.基础的网络结构说明 软件路由器 ikuai 当然同一个仅主机模式 相当于在 同一个我们所谓的广播域内 所以相当于它们的几张网卡 是被连接起来的 为了防止出现问题 我们可以把第二块网卡临时关闭一下 2.准备路由器 ikuai 爱快 iKuai-商业场景网络解决方案提供商 (ikuai8.com)…

【为什么会有 map、weakmap 类型?】

为什么会有 map、weakmap 类型? 传统对象的局限性催生 Map‌1. 键类型单一性‌2. 有序性与迭代支持‌3. 性能优化场景‌ 内存管理需求催生 WeakMap‌1.弱引用机制‌2. 私有数据存储‌3. 规避循环引用问题‌ 总结 传统对象的局限性催生 Map‌ 1. 键类型单一性‌ 传统对象&…

HTML-05NPM使用踩坑

2025-03-04-NPM使用踩坑 本文讲述了一个苦逼程序员在使用NPM的时候突然来了一记nmp login天雷,然后一番折腾之后,终究还是没有解决npm的问题😞😞😞,最终使用cnpm完美解决的故事。 文章目录 2025-03-04-NPM使用踩坑[toc…

java后端开发day27--常用API(二)正则表达式爬虫

(以下内容全部来自上述课程) 1.正则表达式(regex) 可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps:一…

鸿蒙HarmonyOS评论功能小demo

评论页面小demo 效果展示 1.拆解组件,分层搭建 我们将整个评论页面拆解为三个组件,分别是头部导航,评论项,回复三个部分,然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…