Java设计模式初识之备忘录模式详解

 更新时间:2022年11月04日 09:21:01   作者:程序员翔仔  
备忘录设计模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。本文将通过示例为大家介绍一些备忘录模式的定义与使用,需要的可以参考一下

简介

备忘录设计模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。

其定义是,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象先前的状态。

典型实现

首先,定义一个备忘录 Memento 类存储状态,其代码示例如下:

public class Memento {
    private String state;
 
    public Memento(Originator o) {
        this.state = o.getState();
    }
 
    public void setState(String State) {
        this.state = state;
    }
 
    public String getState() {
        return this.state;
    }
}

然后,把需要被存储状态的对象称作为发起者,定义为 Originator 类,包含用于存储成员数据的属性,其代码示例如下:

public class Originator {
    private String state;
 
    public Originator() {}
 
    // 创建一个备忘录对象
    public Memento createMemento() {
        return new Memento(this);
    }
 
    // 根据备忘录状态恢复原发器状态
    public void restoreMemento(Memento m) {
        state = m.getState();
    }
 
    public void setState(String State) {
        this.state = state;
    }
 
    public String getState() {
        return this.state;
    }
}

定义一个负责人 Caretaker 用于管理备忘录对象,其代码示例如下:

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

总结

优点

备忘录模式的主要优点如下:

给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态

实现了内部状态的封装,使得用户不需要关心状态的保存细节

缺点

备忘录模式的主要缺点如下:

如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源

适用场景

备忘录模式的适用场景如下:

保存一个对象在某一时刻的全部状态或部分状态,方便后续实现恢复和撤销

防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象

源码

在 JDK 中 java.util.Date 通过自身内部的一个 Long 值来实现备忘录模式。

如下是源码部分:

public class Date implements java.io.Serializable, Cloneable, Comparable<Date> {
    private transient long fastTime;
 
    public Date(long date) {
        fastTime = date;
    }
 
    public long getTime() {
        return getTimeImpl();
    }
 
    private final long getTimeImpl() {
        if (cdate != null && !cdate.isNormalized()) {
            normalize();
        }
        return fastTime;
    }
}

到此这篇关于Java设计模式初识之备忘录模式详解的文章就介绍到这了,更多相关Java备忘录模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java数据结构实现双向链表功能

    java数据结构实现双向链表功能

    这篇文章主要为大家详细介绍了java数据结构实现双向链表功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java设计模式之单件模式深入讲解

    Java设计模式之单件模式深入讲解

    有人说单件模式是最简单的模式,因为它只有一个类,但其实它还有一些值得注意的地方,就如:出现并发性时,单件可能已经不是单件了
    2021-11-11
  • 很多人竟然不知道Java线程池的创建方式有7种

    很多人竟然不知道Java线程池的创建方式有7种

    本文主要介绍了很多人竟然不知道Java线程池的创建方式有7种,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • idea Maven 插件 docker-maven-plugin 打包docker镜像上传到远程仓库的过程详解

    idea Maven 插件 docker-maven-plugin 打包docker镜像上传到远程仓库的过程详解

    这篇文章主要介绍了idea Maven插件docker-maven-plugin打包docker镜像上传到远程仓库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 详解JUnit5参数化测试的几种方式

    详解JUnit5参数化测试的几种方式

    参数化测试一直是津津乐道的话题,我们都知道JMeter有四种参数化方式:用户自定义变量、用户参数、CSV文件、函数助手,那么JUnit5有哪些参数化测试的方式呢
    2021-07-07
  • SpringBoot配置 Druid 三种方式(包括纯配置文件配置)

    SpringBoot配置 Druid 三种方式(包括纯配置文件配置)

    本文给大家分享在项目中用纯 YML(application.yml 或者 application.properties)文件、Java 代码配置 Bean 和注解三种方式配置 Alibaba Druid 用于监控或者查看 SQL 状况的相关知识,感兴趣的朋友一起看看吧
    2021-10-10
  • 利用Java读取二进制文件实例详解

    利用Java读取二进制文件实例详解

    这篇文章主要给大家介绍了利用Java读取二进制文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用java具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • Java处理图片实现base64编码转换

    Java处理图片实现base64编码转换

    这篇文章主要介绍了Java处理图片实现base64编码转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 使用JMeter进行接口高并发测试的实现

    使用JMeter进行接口高并发测试的实现

    本文主要介绍了使用JMeter进行接口高并发测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 平衡二叉树的左右旋以及双旋转的图文详解

    平衡二叉树的左右旋以及双旋转的图文详解

    今天小编就为大家分享一篇关于平衡二叉树的左右旋以及双旋转的图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论