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

news2024/9/27 10:15:19

文章目录

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

在这里插入图片描述

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

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

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

备忘录模式的奥秘

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

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

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

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

备忘录涉及角色

  • 发起人(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.coloradmin.cn/o/2169665.html

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

相关文章

调用飞书接口导入供应商bug

1、业务背景 财务这边大部分系统都是供应商项目,由于供应商的研发人员没有飞书项目的权限,涉及到供应商系统需求 财务这边都是通过多维表格进行bug的生命周期管理如图: 但多维表格没有跟飞书项目直接关联,测试组做bug统计的时候无…

【Docker】01-Docker常见指令

1. Docker Docker会下载镜像,运行的时候,创建一个隔离的环境,称为容器。 docker run -d \ # 创建并运行一个容器,-d表示后台运行 --name mysql \ # 容器名称-p 3307:3306 \ # 端口映射,宿主机端口映射到容器端口-e TZ…

打造同城O2O平台:外卖跑腿APP的架构与功能设计详解

今天,小编将于大家共同讨论外卖跑腿APP的架构设计及其核心功能,旨在为开发者提供一份详尽的参考。 一、外卖跑腿APP的架构设计 1.整体架构概述 通常包括前端、后端和数据库。 2.前端设计 用户端提供直观的界面,方便用户下单、查询订单状态…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于自适应时段划分的含氢微能网中长期变分辨率调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Rust gRPC---Tonic实战

API 一个API做了两件事 客户端发起请求Request服务端作出响应Response REST是什么 REST(Representational State Transfer):表现层状态传输,是一种设计风格,通常将 HTTP API 称为 RESTful API、RESTful 服务或 RES…

AI大模型生态暨算力大会今日举行,20位大咖领衔共探「AI NATIVE,生成未来」

出品|AI大模型工场 9月25日消息,由AI大模型工场主办AI大模型生态暨算力大会今日举行。作为国内最具影响力与最懂大模型的AI生态大会,大会讨论了AI大模型的最新进展和未来发展趋势。 2024年被业内称为大模型应用落地元年,大模型产…

【入门01】arcgis api 4.x 创建地图、添加图层、添加指北针、比例尺、图例、卷帘、图层控制、家控件(附完整源码)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title></title><link rel"s…

JSP+Servlet+Mybatis实现列表显示和批量删除等功能

前言 使用JSP回显用户列表&#xff0c;可以进行批量删除&#xff08;有删除确认步骤&#xff09;&#xff0c;和修改用户数据&#xff08;用户数据回显步骤&#xff09;使用servlet处理传递进来的请求参数&#xff0c;并调用dao处理数据并返回使用mybatis&#xff0c;书写dao层…

828华为云征文|华为云Flexus云服务器X实例的网络性能测试

828华为云征文&#xff5c;华为云Flexus云服务器X实例的网络性能测试 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、iperf3工具介绍2.1 iperf3简介2.2 iperf3特点 三、本次实践介绍3.1 本次实践…

专利如何有效维持?

专利的获得并非一劳永逸&#xff0c;其法律效力的持续存在依赖于有效的专利维持工作。专利维持&#xff0c;即专利权人在专利有效期内&#xff0c;按照法定程序缴纳年费、提交必要的文件&#xff0c;以保持专利权的有效状态。这一过程对于确保创新成果持续闪耀、维护企业竞争优…

DSP——从入门到放弃系列——多核导航器(持续更新)

1、概述 C6678中的数据移动非常复杂&#xff0c;多核导航器是C6678中协助完成在器件内高速数据包移动的外围设备。 2、组成 多核导航器由1个队列管理子系统&#xff08;QMSS&#xff09;1个包DMA&#xff08;Packet DMA PKTDMA&#xff09;来控制和实现器件内的高速数据包移…

Arthas mc(Memory Compiler/内存编译器 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.2 mc &#xff08;Memory Compiler/内存编译器 &#xff09;举例1&#xff1a;可以通过-d命令指定输出目录&#xff1a;mc -d /temporary/tmp /temporary/tmp/AccountController.java举例2&#xff1a;通过--classLoade…

SpringBoot-全局处理异常,时间格式,跨域,拦截器,监听器

1.全局异常处理 使用ControllerAdvice与ExceptionHandler注解 /*** 全局异常处理程序** author * date */ ControllerAdvice ResponseBody public class GlobalExceptionHandler {ExceptionHandler(Exception.class)public JsonResult handleException(Exception e) {e.print…

Vue3 中 this 一分钟了解

Vue3 中 this 在Vue3的开发过程中&#xff0c;this的使用方式和Vue2有着显著的不同&#xff0c;特别是在组合式API&#xff08;Composition API&#xff09;的引入后。本文将深入探讨Vue3中this的使用&#xff0c;解析其底层源码&#xff0c;并探讨这种设计背后的原因&#xff…

Heart Animated Realistic 心脏运动模型素材带动画

Realistic Heart具有两个多边形质量的网格,具有详细的解剖结构,并配有高清纹理2048x2048,在高低多边形网格上具有高清法线贴图,可在教育、游戏和虚拟现实场景中获得更好、更真实的效果。 还具有完整的心动周期。 下载:​​Unity资源商店链接资源下载链接 效果图:

51单片机如何判断浮点数nan

使用这个函数进行判断 帮助信息内的描述如下 _chkfloat_ #include <intrins.h> unsigned char _chkfloat_ (float val); /* number for error checking */ Description: The _chkfloat_ function checks the status of a floating-point number. Return Value: The…

短视频去水印解析api接口使用文档

短视频去水印解析api接口&#xff0c;支持各大平台短视频和图集。 请求示例&#xff1a;https://www.dspqsy.vip/spapi?key密钥&url短视频链接 返回数据格式&#xff1a;JSON 请求方式&#xff1a;GET/POST 请求参数&#xff1a;url (短视频分享的URL) PHP 源码&…

C语言数组探秘:数据操控的艺术【下】

承接上篇&#xff0c;我们继续讲数组的内容。 八.二维数组的使用 当我们掌握了二维数组的创建和初始化&#xff0c;那我们怎么使用二维数组呢&#xff1f;其实二维数组访问也是使用下标的形式的&#xff0c;二维数组是有行和列的&#xff0c;只要锁定了行和列就能唯一锁定数组中…

Race Karts Pack 全管线 卡丁车赛车模型素材

是8辆高细节、可定制的赛车,内部有纹理。经过优化,可在手机游戏中使用。Unity车辆系统已实施-准备驾驶。 此套装包含8种不同的车辆,每种车辆有8-10种颜色变化,总共有75种车辆变化! 技术细节: -每辆卡丁车模型使用4种材料(车身、玻璃、车轮和BrakeFlare) 纹理大小: -车…

屏幕活动保存到NAS

目录 一、套件选择 二、员工机准备 1、下载安装ffmpeg 2、安装运行rtsp-simple-server 3、生成桌面流 4、接收查看桌面变化 三、NAS端配置 1、安装套件 2、配置Surveillence Station 3、实时监看 4、历史记录查看 5、录像文件操作 四、总结 朋友的朋友找上我,说到…