TypeScript 设计模式之【备忘录模式】

文章目录

  • 备忘录模式:时光机器的魔法
  • 备忘录模式的奥秘
    • 备忘录模式有什么利与弊?
    • 如何使用备忘录模式来优化你的系统
    • 代码实现案例
    • 备忘录模式的主要优点
    • 备忘录模式的主要缺点
    • 备忘录模式的适用场景
    • 总结

在这里插入图片描述

备忘录模式:时光机器的魔法

想象一下,如果你能拥有一台时光机器,可以随时回到过去的某个时,那该有多么神奇?在软件开发中,我们经常需要保存对象的历史状态,以便在需要时恢复。备忘录模式就像这台时光机器,它允许我们捕获对象的内部状态,并在之后将对象恢复到这个状态。

在复杂的应用程序中,我们经常需要实现撤销、回滚或者保存历史记录的功能。备忘录模式提供了一种优雅的方式来实现这些功能,而不会破坏对象的封装性,让我们一起探索这个神奇的"时光机器"吧!

备忘录模式的奥秘

备忘录模式就像一个"状态快照系统",它提供了一种方法,可以在不破坏封装的前提下捕获一个对象的内部状态,并在之后将对象恢复到这个状态。通过这个状态快照系统,你可以轻松实现撤销、恢复等功能,使得系统更加灵活和强大。

备忘录模式有什么利与弊?

备忘录模式的优点是可以保存和恢复对象的状态,而不破坏封装性。它遵循单一职责原则,将状态管理的责任从原发器对象中分离出来。缺点是会消耗大量的内存,特别是在需要存储大量历史状态的情况下。

如何使用备忘录模式来优化你的系统

备忘录涉及角色

  • 发起人(Originator): 创建并在需要时使用备忘录来恢复自身状态
  • 备忘录(Memento): 存储发起人对象的内部状态
  • 管理者(Caretaker): 负责保存备忘录,但不能操作或检查备忘录的内容

备忘录步骤

  1. 创建发起人类,包含需要保存的状态
  2. 创建备忘录类,用于存储发起人的状态
  3. 在发起人类中实现创建备忘录和从备忘录恢复状态的方法
  4. 创建管理者类,负责存储和管理备忘录对象
  5. 在客户端代码中使用管理者来保存和恢复发起人的状态

选择合适的备忘录模式,你就能轻松地实现状态的保存和恢复,让系统变得更加灵活和强大!

代码实现案例

// 备忘录类
class Memento {private state: string;constructor(state: string) {this.state = state;}// 获取状态getState(): string {return this.state;}
}// 文本编辑器
class TextEditor {private content: string = "";// 设置内容setContent(content: string): void {this.content = content;}// 获取内容getContent(): string {return this.content;}// 创建备忘录createMemento(): Memento {return new Memento(this.content);}// 从备忘录恢复状态restoreFromMemento(memento: Memento): void {this.content = memento.getState();}
}// 历史管理者类
class History {private mementos: Memento[] = [];// 添加备忘录addMemento(memento: Memento): void {this.mementos.push(memento);}getMemento(index: number): Memento {return this.mementos[index];}
}// 客户端代码
const editor = new TextEditor();
const history = new History();editor.setContent("这是第一行文本。");
history.addMemento(editor.createMemento());editor.setContent("这是第二行文本。");
history.addMemento(editor.createMemento());editor.setContent("这是第三行文本。");
console.log("当前内容:", editor.getContent());// 撤销到第二个状态
editor.restoreFromMemento(history.getMemento(1));
console.log("撤销后内容:", editor.getContent());// 撤销到第一个状态
editor.restoreFromMemento(history.getMemento(0));
console.log("再次撤销后内容:", editor.getContent());// 输出
// 当前内容: 这是第三行文本。
// 撤销后内容: 这是第二行文本。
// 再次撤销后内容: 这是第一行文本。

在这里插入图片描述

备忘录模式的主要优点

  1. 封装性好: 备忘录模式可以将对象状态的保存和恢复封装在备忘录对象中,不会破坏原对象的封装性
  2. 提供了状态恢复的机制: 可以方便地实现撤销、回滚等功能
  3. 简化了发起人: 发起人不需要关心状态的保存细节,这些都被转移到了备忘录对象中
  4. 提供了对象状态的快照: 可以在不同的时间点保存对象的状态,便于后续的恢复或比较

备忘录模式的主要缺点

  1. 消耗大量内存: 假如需要保存的状态数量很多,或者状态内容很大,会占用大量的内存
  2. 影响性能: 频繁地创建和恢复状态可能会影响系统的性能
  3. 暴露对象的内部结构: 为了存储和恢复对象的状态,需要暴露一些原本不需要暴露的内部结构

备忘录模式的适用场景

  1. 需要保存和恢复数据的场景: 如撤销、回滚功能
  2. 需要监控对象状态的场景: 如调试时保存对象的历史状态
  3. 需要保存的副本数量不确定的场景: 如保存游戏进度
  4. 希望保持封装性,又需要保存对象状态的场景

总结

备忘录模式是一种行为型设计模式,它通过将对象的状态保存在外部的备忘录对象中,实现对象状态的保存和恢复。备忘录模式通过将状态管理的责任从原对象中分离出来,提高系统的灵活性和可维护性。合理使用备忘录模式,能让你的代码更加健壮,更容易实现复杂的状态管理功能。

喜欢的话就点个赞 ❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告: TypeScript 设计模式之【观察者模式】

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60&am…

万博智云CEO王嘉在华为全联接大会:以创新云应用场景,把握增长机遇

一、大会背景 2024年9月19-21日,第九届华为全联接大会将在上海世博展览馆和上海世博中心举办。作为华为的旗舰盛会,本次大会以“共赢行业智能化”为主题邀请了众多思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁,从战略、产业、…

Nginx基础详解3(nginx.conf核心代码讲解、常用命令解析、Nginx日志切割)

续Nginx基础详解2(首页解析过程、进程模型、处理Web请求机制、nginx.conf语法结构)-CSDN博客 目录 8.nginx.conf核心代码 8.1错误日志 8.1.1第一列: 8.1.2第二列: 8.1.3第三列: 8.2 #pid 8.3http模块&#xff…

A开头的词根词缀:-ate+a-+ab\abs+ab\c\d\f\g\n\p\r\s\t+ad+amph+an+ana+ante+anti+anthrop+

ate -ate,它是英语单词中的后缀词缀。它加在词根或词干上分三种词性。 首先第一种词性adj.(形容词),它主要加缀在名词词根或词干上构成的形容词:……的,有……的,像……的,For example:accurate(adj.正确的&#xff…

如何实现全行业证照一站式结构化识别?Textln企业资质证照识别上线!

企业经营活动中,资质证书是证明企业具备某项行业准入的必要证件。但企业资质证书种类繁多,各行各业的资质证书都有差异,同一行业、不同地区出具的资质证书版式也各不相同,通过传统标注训练的方式难以全量覆盖各类企业资质证照的识…

【JAVA开源】基于Vue和SpringBoot的墙绘产品展示交易平台

本文项目编号 T 049 ,文末自助获取源码 \color{red}{T049,文末自助获取源码} T049,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

机器人顶刊IEEE T-RO发布无人机动态环境高效表征成果:基于粒子的动态环境连续占有地图

摘要:本研究有效提高了动态环境中障碍物建模的精度和效率。NOKOV度量动作捕捉系统助力评估动态占用地图在速度估计方面的性能。 近日,上海交通大学、荷兰代尔夫特理工研究团队在机器人顶刊IEEE T-RO上发表题为Continuous Occupancy Mapping in Dynamic …

【C语言】手把手带你拿捏指针(完)(指针笔试、面试题解析)

文章目录 一、sizeof和strlen的对⽐1.sizeof2.strlen3.sizeof与strlen对比 二、数组和指针笔试解析1.一维数组2.字符、字符串数组和字符指针代码1代码2代码3代码4代码5代码6 3.二维数组4.总结 三、指针运算笔试题解析代码1代码2代码3代码4代码5代码6 一、sizeof和strlen的对⽐ …

线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

排序--希尔排序

希尔排序介绍 希尔排序核心思想就是:1,分组;2,直接插入排序:越有序越快 希尔排序就是多次利用直接插入排序的一个排序算法. 希尔排序的算法思想:间隔式分组,利用直接插入排序让组内有序,然后缩小分组再次排序,直到组数为1希尔排序的理论基础就是直接插入排序越有序越快; 希尔排…

Redis-----通用命令(keys, exists, del, expire, ttl, type)

通用命令 一. 前言.1.1 通用命令1.2 Redis常用的数据类型1.2.1 String(字符串)1.2.2 List(列表)1.2.3 Set(集合)1.2.4 Hash(哈希)1.2.5 Zset(有序集合) 二. 通…

通过 OpenAI API 实测 o1 模型(附源码)

9.11 与 9.9 哪个大? 还记得之前给大家演示的幻觉问题么? 用 gpt4 系列模型提问“9.11 与 9.9 哪个大?” 大家可以回顾一下,即使引导了 COT 的思路,但是 gpt4 还是一本正经的胡说八道。 如今,o1 已经完美解决数学、逻辑推理方…

探索 Snowflake 与 Databend 的云原生数仓技术与应用实践 | Data Infra NO.21 回顾

上周六,第二十一期「Data Infra 研究社」在线上与大家相见。活动邀请到了西门子数据分析师陈砚林与 Databend 联合创始人王吟,为我们带来了一场关于 Snowflake 和 Databend 的技术探索。Snowflake,这个市值曾超过 700 亿美元的云原生数据仓库…

《概率论与数理统计》学渣笔记

文章目录 1 随机事件和概率1.1 古典概型求概率随机分配问题简单随机抽样问题 1.2 几何概型求概率1.3 重要公式求概率 2 一维随机变量及其分布2.1 随机变量及其分布函数的定义离散型随机变量及其概率分布(概率分布)连续型随机变量及其概率分布&#xff08…

数据结构和算法之树形结构(4)

文章出处:数据结构和算法之树形结构(4) 关注码农爱刷题,看更多技术文章!!! 六、红黑树(接前篇) 红黑树是为了弥补AVL树在大规模频繁增删节点场景下性能不理想而设计出来的一种平衡二叉查找树。红黑树不是一种严…

【论文阅读】Diffusion Policy: Visuomotor Policy Learning via Action Diffusion

Abstract 本文介绍了扩散策略,这是一种通过将机器人的视觉运动policy表示为条件去噪扩散过程来生成机器人行为的新方法。我们对来自 4 个不同的机器人操作基准的 15 个不同任务的扩散策略进行了基准测试,发现它始终优于现有的 state-of-the-art 机器人学…

word批量裁剪图片,并调整图片大小,不锁定纵横比

在word中有若干图片待处理,裁剪出指定内容,调整成指定大小。如下是待处理的图片: 这时,选择视图,选择宏,查看宏 选择创建宏 添加cut_picture代码如下,其中上、下、左、右裁剪的橡塑尺寸根据自己…

C#入门教程

目录 1.if分支语句 2.面向对象 3.static简单说明 1.if分支语句 我们的这个C#里面的if语句以及这个if-else语句和C语言里面没有区别,就是打这个输出上面的方式不一样,c#里面使用的是这个console.writeline这个指令,其他的这个判断逻辑都是一…

【优选算法】(第四篇)

目录 三数之和(medium) 题目解析 讲解算法原理 编写代码 四数之和(medium) 题目解析 讲解算法原理 编写代码 三数之和(medium) 题目解析 1.题目链接:. - 力扣(LeetCode&…

鸿蒙开发(NEXT/API 12)【基础功能(使用剪贴板进行复制粘贴)】剪贴板服务

场景介绍 [剪贴板]为开发者提供数据的复制粘贴能力。 当需要使用复制粘贴等功能时&#xff0c;例如&#xff1a;复制文字内容到备忘录中粘贴&#xff0c;复制图库照片到文件管理粘贴&#xff0c;就可以通过剪贴板来完成。 约束限制 剪贴板内容大小<128MB。为保证剪贴板数…