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

news/2024/9/28 14:52:22/

文章目录

在这里插入图片描述

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

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

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

备忘录模式的奥秘

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

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

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

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

备忘录涉及角色

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

备忘录步骤

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

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

代码实现案例

typescript">// 备忘录类
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.ppmy.cn/news/1531136.html

相关文章

初识ZYNQ——FPGA学习笔记15

一、ZYNQ简介 ZYNQ:Zynq-7000 All Programmable SoC(APSoC),赛灵思公司(AMD Xilinx)推出的新一代全可编程片上系统 PS:Processing System,处理系统 PL:Program Logic&…

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

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

对比学习与图像去雾在24TIP和CVPR经典图像去雾论文中的良好结合,展示出模型良好的泛化能力(本期内容较详细 多)

今天主要内容是图像去雾,对比学习,无监督学习,要分享的三篇论文分别是: 21CVPR Contrastive Learning for Compact Single Image Dehazing 24 TIP UCL-Dehaze: Toward Real-World Image Dehazing via Unsupervised Contrastive Le…

MySQL基础知识(三)

1. 存储过程 存储过程是基于SQL语言的过程化编程扩展,允许将一系列SQL语句封装为一个可执行的程序。通过这种方式,可以提高执行效率,因为存储过程在编译后只需通过调用和参数传递来使用,而无需每次执行时都进行解析和编译。这种特…

物理学基础精解【7】

文章目录 平面方程直角坐标及基本运算线段的定比分点一、定义二、坐标公式三、特殊情况四、应用举例五、推导过程(简要)两直线的交点和两曲线的交点两直线的交点两曲线的交点例题:求两直线的交点例题:求两曲线的交点 参考文献 平面…

Linux之我不会

一、常用命令 1.系统管理 1.1 systemctl start | stop | restart | status 服务名 案例实操 1 查看防火墙状态 systemctl status firewalld2 停止防火墙服务 systemctl stop firewalld3 启动防火墙服务 systemctl start firewalld4 重启防火墙服务 systemctl restart f…

Django1.5自定义User模型

#Django1.5自定义User模型 Django1.5自定义用户profile可谓简单很多,编写自己的model类MyUser,MyUser至少要满足如下要求: 必须有一个整型的主键有一个唯一性约束字段,比如username或者email,用来做用户认证提供一种方…

CSS布局中的定位

一、position 1.static position: static; 默认值,没有定位2 .relative 相对定位:相对自身原来的位置进行偏移 偏移设置:top、left、right、bottom 相对定位元素的规律: 设置相对定位的盒子会相对于它原来的位置,通…