代码编织梦想

别把一辈子过成一天。

简介

备忘录模式是属于行为型设计模式的一种。

该模式的核心思想是在不破坏封装性的前提下,捕获一个对象的内部状态,并且在该对象之外保存捕获到的状态。这样做的意义是确保以后可以随时将该对象恢复到原来保存的某一状态时。

通俗点说备忘录模式就是通过一种特定的手段来记录一个对象的某一状态,或者是该对象的某些数据,当要做回退时,可以轻松的从备忘录中获取原来的状态、数据并进行恢复。

备忘录模式UML类图

在这里插入图片描述

类图讲解

Originator:原始对象,也可理解为需要做备忘的对象。
Memento:备忘录对象,该类的作用就是记录Originator的内容。
Caretaker:守护者对象,用于维护所有的Memento对象。
Client:客户端测试类。

案例讲解

案例:通过代码模拟平时我们进行撤回的操作。

备忘录类

public class Memento {

  // 数据
  private String data;

  public Memento(String data) {
    this.data = data;
  }

  public String getData() {
    return data;
  }
}

原始对象

public class Originator {

  // 数据
  private String data;

  public String getData() {
    return data;
  }

  public void setData(String data) {
    this.data = data;
  }

  // 创建备忘录对象
  public Memento createMemento() {
    return new Memento(data);
  }

  // 根据备忘录对象进行恢复
  public void recover(Memento memento) {
    data = memento.getData();
  }
}

守护者类

public class Caretaker {

  private List<Memento> mementos = new ArrayList<>();

  // 添加一个备忘录对象
  public void add(Memento memento) {
    mementos.add(memento);
  }

  // 获取最近一次保存的备忘录对象
  public Memento obtain() {
    return mementos.get(mementos.size() - 1);
  }

}

客户端测试类

public class Client {

  public static void main(String[] args) {
    Originator originator = new Originator();
    originator.setData("第一次:初始化");
    System.out.println(originator.getData());
    // 进行备忘
    Memento memento = originator.createMemento();
    Caretaker caretaker = new Caretaker();
    caretaker.add(memento);
    // 修改数据
    originator.setData("第二次:进行修改");
    System.out.println(originator.getData());
    // 还原数据
    System.out.println("进行还原");
    originator.recover(caretaker.obtain());
    System.out.println(originator.getData());
  }
}

执行结果

在这里插入图片描述

总结

1、备忘录模式给用户提供了一种可恢复的机制,使得用户能够方便地回到某个历史的状态。

2、备忘录模式进行了信息的封装,用户使用时不需要关心状态保存的细节。

3、类的成员变量过多的话进行备份肯定会占用较大的资源,并且每一次的保存都会消耗一定的内存。

4、备忘录模式可以和原型模式配合使用,进而可以节约资源。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/first_M/article/details/111092840

用辗转相除法求两个整数的最大公约数-爱代码爱编程

其中运用了怎样使得键盘所输的数进入方法中 再根据欧几里得的定义gcd(a,b)=gcd(b,a%b) 来设置下方法。 package ; 用辗转相除法算最大公因数 import java.util.Scanner; public class hahahha { public static void main(String[] args) {

JavaWeb项目:订单管理系统-爱代码爱编程

1.项目搭建 1. 创建一个maven web项目 2. 配置tomcat 3. 测试项目是否能够跑起来 4. 导入项目中会遇到的jar包: jsp,servlet,mysql驱动,jstl,standard等等 5. 创建项目结构 6. 编写实体类pojo(entity): ORM:表-类映射 7. 编写基础公共类: 1)在res

Java常用基础知识-爱代码爱编程

修饰符基本数据类型Number & Math 类Number & Math 类常用的一些方法:CharSequenceString 类StringBuffer 和 StringBuilder 类数组日期时间Java 流(Stream)、文件(File)和IO杂记 菜鸟驿站的评论区还挺有用的 修饰符 https://www

项目 3 统计考试成绩-爱代码爱编程

项目 3 统计考试成绩 请编写一个 Java 应用程序读入多个考试成绩值,统计显示输入的成绩个数,最低成绩 和最高成绩。 分数值在[0,100]范围内,-999 表示结束输入。当输入的分数值小于 0 或大于 100 时,给 出提示信息要求重新输入。参与统计的成绩均为有效成绩,也就是说小于 0或大于 100 或-999 是不在统计之列的。 数据输入输出的

vue this is undefined-爱代码爱编程

在使用axios经常会出现这个问题 如下面代码 data(){ return{ goods:{ title:null, subTitle:null, originalCost:null, currentPrice:null, discount:null, isFreeD

ArrayList 源码解析,看完就明白系列<一>-爱代码爱编程

Arraylist ,是我们平常使用非常频繁的一个集合,我们从最常用的方式 开始解析 ArrayList<String> arrlist1 = new ArrayList(); arrlist1.add("1"); arrlist1.add("2"); ... ... ... 以此增加11个元素 .

Python3 《零基础小白从入门到实战》之“for循环”-爱代码爱编程

for循环,每次循环,循环变量都会获取遍历对象中的一个值,执行循环体语句,当遍历对象中的值,全部获取完毕,停止循环。 for 被循环的数据需要多个数据 for循环可以循环 list, tuple, dict, str 语法格式: for 循环变量 in 遍历(循环)对象: 循环体 例如1: for i in (

关于三菱GXWORK安装失败或者安装向导被中断的解决办法-爱代码爱编程

在安装三菱GXwork3软件时,有时会莫名安装失败,有时重装系统也不行,总结了以下几点可能会影响,另针对这几点的解决办法(无需重装系统)。 问题点1: 之前安装的三菱软件没有卸载干净,注册表里没有清理干净  。 (解决办法:卸载软件,然后用360或者电脑管家把卸载残留清理,把安装目录下的文件全部删除干净,进入注册表,把MITSUBISHI相关全部删除)

CSGO在完美对战平台和官匹启动后秒退问题-爱代码爱编程

CSGO在完美对战平台和官匹启动后秒退问题 我遇到的问题我的环境我的解决方法其一我的解决方法其二导致问题的原因 我遇到的问题 在2020年11月,我的csgo完美对战平台和官匹启动后都秒退,任务管理器中可以看到csgo进程,但2-3秒后自动关闭,完美对战平台检测显示无法连接到社区服务器,与此同时5e对战平台可以正常启动。 先后尝试验证完整性和

如何理解和预测客户终身价值-爱代码爱编程

什么是CLTV? 客户终身价值(Customer Lifetime Value, CLTV或LTV)是表明业务整体健康状况和在客户生命周期中留住客户的能力的最重要指标之一。当客户选择使用公司的产品或服务一段时间后,TA们在这段时间内支付的净额将决定TA们的终身价值。了解和监测客户在整个客户旅程中的价值,可以让公司规划并提高各种活动的生产力和效率。 CL

Python3 《零基础小白从入门到实战》之“for循环--嵌套”-爱代码爱编程

for循环--嵌套 是我们在学习python中遇到的第一个难点,小伙伴要努力,努力,在努力啦~ 例如1: cases = [ ["http://example.com/login", "get", "yuz"], ["http://example.com/register", "put", "yw"], ["http://exa

Python3 《零基础小白从入门到实战》之“range 函数”-爱代码爱编程

range 函数作用:可以生成一个整数列表 语法格式: range (start , stop , step) 参数说明: start: 开始数,可选参数,默认值为 0 stop: 结束数,必选参数,最大值为 stop-1 step: 步长,每次循环增加值,可选参数,默认值为 1、