设计模式: 行为型之备忘录模式(13)

备忘录模式概述

  • 备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态
  • 这样以后就可将该对象恢复到原先保存的状态。这种类型的设计模式属于行为模式
  • 在备忘录模式中,主要涉及三种角色:
    • 发起人(Originator)角色
      • 记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
      • 发起人可以根据需要决定备忘录存储发起人的哪些状态
    • 备忘录(Memento)角色
      • 负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录
      • 备忘录有两个接口,一是提供它所能保存的发起人内部状态,二是将这些状态恢复到发起人对象中
    • 管理者(Caretaker)角色
      • 负责保存好备忘录,不能对备忘录的内容进行操作或检查

备忘录模式应用

// 原始类(Originator)定义
class Originator {
  private state: string; // 内部状态

  constructor(state: string) {
    this.state = state;
  }

  // 创建备忘录方法,返回备忘录对象
  createMemento(): Memento {
    return new Memento(this.state);
  }

  // 设置内部状态方法,可以通过备忘录恢复状态
  setMemento(memento: Memento) {
    this.state = memento.getState();
  }

  // 其他业务逻辑,改变内部状态
  setState(newState: string) {
    this.state = newState;
    console.log(`State changed to: ${this.state}`);
  }

  // 获取当前状态
  getState(): string {
    return this.state;
  }
}

// 备忘录接口和实现
interface Memento {
  getState(): string;
}

class ConcreteMemento implements Memento {
  private _state: string;

  constructor(state: string) {
    this._state = state;
  }

  getState(): string {
    return this._state;
  }
}

// 管理者角色(Caretaker)负责保管备忘录,但不关心备忘录的具体内容
class Caretaker {
  private _mementos: Memento[] = [];

  // 添加备忘录
  addMemento(memento: Memento) {
    this._mementos.push(memento);
  }

  // 获取备忘录,通常由原始类调用
  getMemento(index: number): Memento | undefined {
    return this._mementos[index];
  }
}

// 示例用法
const originator = new Originator("Initial State");
console.log("Original state:", originator.getState());

// 创建一个备忘录并保存状态
const caretaker = new Caretaker();
caretaker.addMemento(originator.createMemento());

// 改变原始类的状态
originator.setState("New State");
console.log("Changed state:", originator.getState());

// 通过备忘录恢复状态
if (caretaker.getMemento(0)) {
  originator.setMemento(caretaker.getMemento(0)!);
  console.log("Restored state:", originator.getState());
}
  • 在这个例子中:Originator 类代表了一个包含内部状态的对象,它定义了如何创建 (createMemento) 和恢复 (setMemento) 备忘录。
  • Memento 是一个接口,代表备忘录对象,它包含了对内部状态的引用,但对外部世界隐藏了这些状态的具体内容。ConcreteMemento 类实现了这个接口,存储了实际的状态值。
  • Caretaker 类扮演管理者角色,它可以接收备忘录并存储它们,但它并不知道如何解读备忘录的内容。当需要时,它把备忘录交还给 Originator 进行状态恢复。
  • 通过这种模式,我们可以安全地保存和恢复 Originator 的内部状态,同时保持了良好的封装性

备忘录模式的优缺点


1 )优点

  • 它提供了一种可以撤销操作的机制
  • 封装了内部状态,并通过对外部提供的接口来恢复内部状态

2 ) 缺点

  • 如果发起人状态很大或者很多,那么存储起来可能会消耗很大的内存
  • 可能会存在很多备忘录对象,消耗内存
  • 在实际应用中,备忘录模式通常用于实现诸如“撤销”这样的功能,例如文本编辑器中的撤销操作
  • 通过保存用户每次编辑操作的状态,可以方便地撤销到之前的状态

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

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

相关文章

从计算机视觉到生命科学

人工智能技术的快速发展正在深刻影响和重塑我们的生活。作为AI领域的前沿方向,多模态大模型凭借其强大的跨域学习和推理能力,在众多行业和科学领域展现出广阔的应用前景。多模态AI指的是能够同时处理和整合文本、图像、音频、视频等不同模态数据的智能系统。这种融合不同信息源…

uni-admin中引入uni-cms的缺少schema及uni-media-library缺少云函数的问题

1. 在管理端运行提示一些表找不到,因为是uni-admin关联的uni-starter的服务空间,在uni-admin的uniCloud中没有内容,在uni-starter的uniCloud中也没有发现对应的表,后面干脆在云端找到对应的表之后新建了,然后再下载到本…

网工内推 | 14薪!安全服务工程师,上市公司,CISP认证优先

01 远江盛邦 招聘岗位:安全服务工程师 职责描述: 1、负责对客户网络、系统进行渗透测试,漏洞验证、安全评估和安全加固; 2、负责对监督单位的系统安全问题进行监督,并督察改进; 3、对监管单位的安全告警、…

机器人流量激增:恶意机器人活动升级与新型规避技术挑战企业安全防御

近日,根据Cyber News引用Thales Imperva Bad Bot发布的最新研究报告,揭示了一个令人警醒的现象:2023年,互联网总流量中的49.6%由机器人贡献,相较于上一年增长了2%,创下了自2013年监测以来的历史新高。这一显…

【性能测试】接口测试各知识第4篇:Jmeter 八大元件及执行顺序,学习目标【附代码文档】

接口测试完整教程(附代码资料)主要内容讲述:接口测试,学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标,RESTFUL1. 理解接口的概念,2.什么是接口测试…

我的2024年暑期三下乡实践宣传投稿之旅

身为2024年暑期大学生三下乡社会实践活动的一员,我肩负着学院赋予的对外信息宣传投稿考核任务。在这条特殊的宣传之路上,我经历了从之初摸着石头过河,一家家联系媒体的艰辛,到后来使用智慧软文发布系统网站进行投稿发文章的轻松转变。 刚开始,我对媒体投稿几乎一无所知。为了完…

力扣136. 只出现一次的数字

Problem: 136. 只出现一次的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 由于题目要求使用线性时间复杂度和常量级的空间复杂度,再加上找重复元素这个特性,我们可以想到使用位运算来求解: 1.任何数与其本身异或得0,任何…

单车模型下Stanley循迹

文章目录 1 Stanley方法2 实现3 参考资料 1 Stanley方法 Stanley与pure pursuit方法都是基于几何的路径跟踪方法,pure pursuit的思想是要让车辆的后轴中心经过目标点,从而计算车辆的前轮转角。Stanley则除了利用横向跟踪误差外,还利用车辆的航…

CSS基础常用属性之颜色(如果想知道CSS的颜色知识点,那么只看这一篇就足够了!)

前言:在我们学习CSS的时候,主要学习选择器和常用的属性,而这篇文章讲解的就是最基础的属性——颜色。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 目录 1.颜色属性 【1】使用颜色关键词表…

《苍穹外卖》Day01知识点记录

一、Yapi 网址为:https://yapi.pro/ 二、Swagger 1. 常用注解 通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下: 注解说明Api用在类上,例如Controller,表示对类的说明ApiMod…

视频号小店的红利来了,跟谁打工不是打工,自己开店,给自己打工

大家好,我是电商花花。 自动抖音小店的飞速崛起,打破了电商何惧,给电商行业注入了新能量,新活力。 而作为一直想要进军电商的腾讯,自然也是不想放过这个机会,更是携着视频号带着视频号小店来电商讨一碗饭…

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day11】 —— MyBatis1

市面上主流ORM框架: EJB:重量级、高花费的ORM技术,支持JPA,尤其是EJB3低侵入式 的设计,增加了Annotation Hibernate:开源,支持JPA ,被选作JBoss的持久层解决方案 iBatis:”SQL Mappi…

CCF区块链论文录用资讯--ICSE 2024

ICSE是CCF A类会议 (软件工程/系统软件/程序设计语言) 其2024录用了13篇区块链论文 Smart Contract and DeFi Security Tools: Do They Meet the Needs of Practitioners? 智能合约和 DeFi 安全工具:它们满足从业者的需求吗? St…

node和go的列表转树形, 执行速度测试对比

保证数据一致性,先生成4000条json数据到本地,然后分别读取文本执行处理 node代码 node是用midway框架 forNum1:number 0forNum2:number 0//执行测试async index(){// 生成菜单列表// const menuList await this.generateMenuList([], 4000);const men…

多任务学习,在共享层,究竟在共享什么?

在多任务学习中,共享层所共享的主要是网络结构和参数。具体来说,当多个任务在共享层进行参数硬共享时,它们使用的是相同的网络结构(例如三层全连接神经网络),并且这些网络层的权重(weights&…

java新冠病毒密接者跟踪系统(springboot+mysql源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的新冠病毒密接者跟踪系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 新冠病毒密接者跟…

【计算机组成原理】加法器原理及其优化

苏泽 本专栏纯个人笔记作用 用于记录408 学习的笔记记录(敲了两年码实在不习惯手写笔记了) 如果能帮助到大家当然最好 但由于是工作后退下来备考 很多说法和想法都会结合实际开发的思想 可能不是那么的纯粹应试哈 希望大家挑选自己喜欢的口味食用…

机器人的非接触式充电和无线充电有什么区别?

文 | BFT机器人 在日新月异的技术浪潮中,接触式与非接触式无线充电之间的微妙差异变得愈发重要,这如同在纷繁复杂的迷雾中增添了一层难以捉摸的迷离。而今,一些所谓的“无线”充电站纷纷涌入市场,它们自诩为无需线缆束缚的新时代…

FAT16文件系统

FAT16 大端存储:高位字节放在低地址端,低位字节放在高地址端。 小端存储:低位字节放在低地址端,高位字节放在高地址端。 举一个例子,比如数字0x12 34 56 78在内存中的表示形式为: 大端模式: 低地…

2024年软件开发行业的薪资水平在下滑的原因?

下降的原因主要包括: 科技行业竞争加剧:随着科技行业竞争的加剧,企业为了压缩成本,开始降低程序员的薪资水平。 人才供应过剩:在计算机成为热门学科的同时,社会上出现了对IT业泡沫和虚假繁荣的质疑。大量…
最新文章