设计模式之备忘录模式

 

写在前面

嗨,伙计!刷到这篇文章就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概3000多字,预计阅读时间长需要4分钟。
  2. 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。
  4. 另外,UML类图是一个非常好的东西,要会看,如果会画就更好了,一图胜千言。

什么是备忘录模式

        备忘录模式,又称之为快照模式(Snapshop Pattern),是一种行为型设计模式,,它允许在不破坏对象封装性的前提下,捕获并保存一个对象的内部状态,以便在需要时恢复该对象到原先的状态。备忘录模式可以为我们提供一种“后悔药”的机制,它通过存储系统中各个历史状态的快照,使得我们可以在任一时刻将系统回滚到历史状态。

备忘录模式有哪些核心角色

备忘录模式的主要角色包括:

  1. 发起人(Originator):发起人角色记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能。
  2. 备忘录(Memento):备忘录角色负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人
  3. 管理者(Caretaker):管理者角色对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

备忘录模式如何实现

需求描述

        经常使用在线笔记类软件进行文本内容编辑的小伙伴肯定有这样的印象:在编写一段文本的时候,使用笔记软件可以手动或者自动地保存文本内容,这里的每一次执行自动或手动的保存就可以理解为当前文本的一次快照,在文本编写的过程中,如果有需要,可以回退到任意历史版本。

实现方法

1、TextContent.java:文本内容实体类,即备忘录发起人角色,除了本身的业务内容外,还具有创建和回退的功能;

/*** 文本内容*/
@Data
@AllArgsConstructor
public class TextContent {private String title;private String content;private Date createTime;/*** 创建备忘录* @return*/public TextContentMemento create(){TextContentMemento textContentMemento = new TextContentMemento(this.title, this.content, this.createTime);return textContentMemento;}/*** 回退指定备忘录内容* @param textContentMemento*/public void rollback(TextContentMemento textContentMemento){this.title=textContentMemento.getTitle();this.content=textContentMemento.getContent();this.createTime=textContentMemento.getCreateTime();}/*** 对象信息展示*/public void show(){System.out.println("标题:"+this.title);System.out.println("内容:"+this.content);}
}

2、TextContentMemento.java:文本内容备忘录实体类,即具体的备忘录角色,与文本内容实体类有相的属性;

/*** 文本内容备忘录*/
@Data
@AllArgsConstructor
public class TextContentMemento {private String title;private String content;private Date createTime;
}

3、TextContentCaretaker.java:文本内容备忘录的管理类,即备忘录管理者角色,可以获取指定备忘录内容、添加备忘录内容、查看备忘的版本数量;

/*** 文本内容备忘录的管理者][*/
public class TextCaretaker {private List<TextContentMemento> list=new ArrayList<>();/*** 备忘录中版本数量* @return*/public Integer size(){return this.list.size();}/*** 获取指定版本备忘录* @param index* @return*/public TextContentMemento get(Integer index){return this.list.get(index);}/*** 添加指定备忘录内容* @param textContentMemento*/public void add(TextContentMemento textContentMemento){this.list.add(textContentMemento);}
}

4、编写客户端,模拟多个版本文本内容编辑并回退到指定版本;

public class Client {public static void main(String[] args) {TextContent textContent = new TextContent("设计模式之备记录模式v1", "this is v1", new Date());System.out.println("v1:");textContent.show();TextCaretaker textCaretaker = new TextCaretaker();//创建并添加第一个快照TextContentMemento textContentMemento = textContent.create();textCaretaker.add(textContentMemento);textContent.setTitle("设计模式之备记录模式v2");textContent.setContent("this is v2");textContent.setCreateTime(new Date());System.out.println("v2:");textContent.show();//创建并添加第二个快照textContentMemento=textContent.create();textCaretaker.add(textContentMemento);//回退第一个快照的内容textContentMemento=textCaretaker.get(0);textContent.rollback(textContentMemento);System.out.println("回退v1:");textContent.show();}
}

备忘录模式适用哪些场景

        备忘录模式适用于以下业务场景:

  1. 保存和恢复对象状态:在软件中,有些对象的状态需要在不同时间点进行保存和恢复。备忘录模式可以捕获对象的状态,并在需要时恢复对象到先前的状态。例如,在浏览器中的后退功能,或者在编辑工具中的撤销操作等。
  2. 实现可回滚的撤销操作:在软件中,撤销操作是一个常见的功能。备忘录模式可以保存对象的状态,以便在撤销操作时恢复对象到先前的状态。例如,在Word中编写文档,如果想要撤销之前的输入/删除操作,可以使用备忘录模式实现可回滚的撤销操作。

        总之,备忘录模式的特点很明显,也很简单,适用于需要保存和恢复对象状态的场景,如撤销操作、游戏存档、事务回滚等类似场景。

备忘录模式的优点和缺点

优点

  1. 可以随时保存一个对象的状态,并在需要时恢复到该状态,提高了程序的灵活性和可维护性;
  2. 发起人和备忘录之间的封装使得客户端无法直接访问备忘录,从而更好地保护了对象的状态信息;
  3. 管理者可以管理多个备忘录,提供了更好的历史记录和回滚功能。

缺点

  1. 备忘录模式的缺点包括:如果备忘录对象过多或者状态信息过于复杂,会占用较多的内存空间;
  2. 捕获和恢复一个对象的状态需要时间和资源,可能会影响程序的性能;

总结

        备忘录模式的本质是在不破坏封装性的前提下,捕获和存储一个对象的内部状态,并在需要时将对象恢复到先前的状态。它可以将对象的状态封装在备忘录对象中,使得对象的状态对外部对象是不可见的。同时,通过引入备忘录类作为中介,发起人对象可以将其状态保存到备忘录对象中,而不需要将其私有状态暴露给其他对象。通过使用备忘录模式,我们可以提高软件的灵活性和可维护性,使得软件更加健壮和易于使用。

 

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

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

相关文章

sql注入学习笔记

sql注入原理 掌握sql注入漏洞的原理掌握sql注入漏洞的分类 万能用户名 777 or 11 #原句 select userid from cms_users where username ".$username." and password".md5 ( $password ) ."输入过后为 select userid from cms_users where username …

深入理解C++关联式容器:set、multiset、map和multimap详解

序列式容器 与 关联式容器 我们知道&#xff1a; C 中&#xff0c;我们将 vector、list、queue 这种底层为线性序列的数据结构叫做 序列式容器&#xff0c;其存储的就是元素本身。而 关联式容器 以键-值对的形式存储数据。每个键在容器中必须是唯一的&#xff0c;而值则与相应…

毕业设计项目:基于java+springboot的共享单车信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…

保姆级Decimal.js的使用(如何解决js精度问题)

精度问题控制台图样 如果银行的业务你这样做&#xff0c;不知道要损失多少钱&#xff0c;这样是不行的&#xff0c;计算的不准确是需要背锅的&#xff0c;我们给后端去做吧&#xff0c;其实我们前端也是可以做的&#xff0c;引入Decimal.js 01.引入Decimal.js decimal.js是使用…

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(2)实现下降沿触发的JK触发器(带异步复位和置位功能)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 JK.v module JK (input clk,input J,input K,input…

TCP编程及基础知识

一、端口号 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理&#xff0c;使用端口号来区分TCP端口号与UDP端口号独立端口用两个字节来表示 2byte&#xff08;65535个&#xff09; 众所周知端口&#xff1a;1~1023&#xff08;1~255之间为众所周知端口&#xff…

macOS使用conda初体会

最近在扫盲测序的一些知识 其中需要安装一些软件进行练习&#xff0c;如质控的fastqc&#xff0c;然后需要用conda来配置环境变量和安装软件。记录一下方便后续查阅学习 1.安装miniconda 由于我的电脑之前已经安装了brew&#xff0c;所以我就直接用brew安装了 brew install …

优秀智慧园区案例 - 珠海华发智慧园区,万字长文解析先进智慧园区建设方案经验

一、项目背景 珠海华发产业园运营管理有限公司&#xff08;简称“产业园公司”&#xff09;是2016年起连续五年跻身“中国企业500强”、国务院国企改革“双百企业”的珠海华发集团旗下的实体产业发展载体运营平台&#xff0c;依托“四园一基地”&#xff1a;中以国际产业园、信…

如何用postman+jmeter实现接口实例

一、接口基础 为什么要单独测试接口&#xff1f; 1. 程序是分开开发的&#xff0c;前端还没有开发&#xff0c;后端已经开发完了&#xff0c;可以提前进入测试 2. 接口直接返回的数据------越底层发现bug&#xff0c;修复成本是越低的 3. 接口测试能模拟功能测试不能测到的异…

【Java 进阶篇】JQuery DOM操作:通用属性操作的绝妙魔法

在前端的舞台上&#xff0c;JQuery犹如一位魔法师&#xff0c;为我们展现了操纵HTML元素的奇妙技巧。而在这个技巧的精妙组成中&#xff0c;通用属性操作是一门绝妙的魔法。在本篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的通用属性操作&#xff0c;揭示这段魔法的神…

C++——gcc、clang和cmake以及make

文章目录 1. CMake和make1.1 生成内容区别1.2 CMakeLists.txt和Makefile内容比较2. clang, gcc和make2.1 基本概念2.2 改进历史(gcc,make,cmake,Ninja)1. CMake和make 1.1 生成内容区别 环境CMake生成最终生成WindowsXXX.slnVisual Studio(MSBuild)处理.sln生成.exe可执行二进…

【架构】后端项目经典分层架构介绍

文章目录 前言分层架构项目实践示例项目结构 其他知识 前言 开发后端项目时&#xff0c;我们最常见的一种架构模式就是分层架构 。 所谓的分层架构&#xff0c;就是把系统自上而下分为多个不同的层&#xff0c;每一层都有特定的功能和职责&#xff0c;且只和自己的直接上层与…