当前位置: 首页 > article >正文

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.kler.cn/a/321625.html

相关文章:

  • Python 中常用的格式符号
  • 双子数(枚举素数)
  • 解决部署RKE2或K3S-“docker.io/rancher/mirrored-pause:3.6\“: -无法拉取镜像办法
  • 云计算复习文档
  • 探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力
  • Python进程间通讯大揭秘:原理深度剖析与实战案例分享
  • 搜索插入位置
  • R包compareGroups详细用法
  • MySQL_插入、更新和删除数据
  • Android中大量使用建造者模式(Builder Pattern)的原因可以归结为以下几点:
  • VMware虚拟机Centos操作系统——配置docker,运行本地打包的镜像,进入conda环境(vmware,docker新手小白)
  • MySQL数据查询(基础)
  • 新React v19特性
  • 面试速通宝典——4
  • Java中的注解处理器:自定义注解与APT工具的应用场景
  • 基于SSM+小程序的医院核酸检测服务管理系统(医院2)(源码+sql脚本+视频导入教程+文档)
  • LabVIEW提高开发效率技巧----利用第三方库和工具
  • Spring Boot与Spring Integration:集成模式的现代化实现
  • C++冷门知识点1
  • 基于SpringBoot+Vue+MySQL的电影院购票管理系统
  • word2vector训练数据集整理(代码实现)
  • 设计模式、系统设计 record part01
  • 生信初学者教程(十一):数据校正
  • 【C语言】手把手带你拿捏指针(完)(指针笔试、面试题解析)
  • 算法学习021 c++有多少张桌子 并查集算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析
  • pandas习题 042:将列标签中的日期由近到远排列