Java设计模式之备忘录模式使用详解

 更新时间:2024年02月11日 10:07:26   作者:程序猿进阶  
这篇文章主要介绍了Java设计模式中备忘录模式的使用,备忘录设计模式也叫作快照模式,主要用于实现防丢失、撤销、恢复等功能,本文将通过示例为大家讲解备忘录模式的定义与使用,需要的同学可以参考一下

前言

备忘录模式(Memento Pattern): 保存对象的某个状态,以便在未来需要的时候进行数据的恢复。相当容易理解,举个简单的例子:Word 软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;

一、备忘录模式的基本介绍

【1】备忘录模式(Memento Pattern): 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

【2】现实生活中备忘录是用来记录某些要去做的事情,或者是记录已经达成共同意见的事情,以防忘记。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作。

【3】备忘录模式属于行为型模式。

【4】实现了信息的封装,使得用户不需要关心状态和保存细节。符合 “单一职责原则” 。

【5】为了节约内存,备忘录模式可以和原型模式配合使用。

二、备忘录模式的结构与类图

忘录模式的核心是设计备忘录类以及用于管理备忘录的管理者类,备忘录模式的主要角色如下:

【1】发起人(Originator)角色: 记录当前对象的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

【2】备忘录(Memetor)角色: 负责存储发起人对象的内部状态,在需要的时候提供这些内部状态给发起人。

【3】管理者(Caretaker)角色: 对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

三、备忘录模式案例分析

我们使用备忘录模式写一个学校 100 米考试的案例:5 人一组,进行分组测试。我们需要备份的对象是,一组学生的成绩。

【1】发起人(Originator)角色: 发起人需要依赖备忘录类,对自己每次记录的成绩进行备份 createMemento 。同时需要提供一个还原方法 getOriginalFromMemento 将需要的备份类作为参数传递进来,并将结果赋值给目标类。

//100 米 测试  5人一组 ,这是个人所花费的时间,我们使用备忘录的方式实现一下。
public class Original {
    //姓名
    private String name;
    //时间
    private int timestamp;
    public Memento createMemento() {
        return new Memento(name, timestamp);
    }
    //获取目标对象  通过排名
    public void getOriginalFromMemento(Memento memento) {
        name = memento.getName();
        timestamp = memento.getTimestamp();
    }
    public int getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(int timestamp) {
        this.timestamp = timestamp;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Original [name=" + name + ", timestamp=" + timestamp + "]";
    }
}

【2】备忘录(Memetor)角色: 提供一些目标对象需要备份的属性,通过构造器进行属性传递。

public class Memento {
    //姓名
    private String name;
    //时间
    private int timestamp;
    //构造器
    public Memento(String name, int timestamp) {
        super();
        this.name = name;
        this.timestamp = timestamp;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(int timestamp) {
        this.timestamp = timestamp;
    }
}

【3】管理者(Caretaker)角色: 创建一个存储备忘录对象的集合 <Map、List、Set> 等,同时创建添加、获取、清空等方法。

public class Caretaker {
    //排名
    private int index = 1;
    //用于顺序存储 参加测试的 十名同学的成绩
    Map<Integer, Memento>  mementos = new HashMap<Integer, Memento>();
    //提供一个 add 方法
    public void add(Memento m) {
        mementos.put(index, m);
        index += 1;
    }
    //获取备份类
    public Memento get(int key) {
        return mementos.get(key);
    }
    //归位
    public void remove() {
        mementos.clear();
    }
}

【4】客户端(Client)角色: 首先将顺序按的前五名同学的成绩及姓名,通过集合 Map 按照名次存储。五名同学测试完成后,通过目标类的 getOriginalFromMemento 方法,根据名次获取同学的成绩,并记录在成绩花名册中。最后,清空记录下一组。

public class Client {
    public static void main(String[] args) {
        //创建 目标类
        Original original = new Original();
        //管理类
        Caretaker managerMemento = new Caretaker();
        //记录成绩
        recordResults(original,managerMemento);
        //获取第一名的成绩
        System.out.println("恢复前目标类的记录值"+original.toString());
        //从集合中获取第一名的值
        Memento memento1 = managerMemento.get(1);
        //调用目标类的还原方法
        original.getOriginalFromMemento(memento1);
        System.out.println("恢复第一名的成绩信息:"+original.toString());
        //从集合中获取第三名的值
        Memento memento3 = managerMemento.get(3);
        //调用目标类的还原方法
        original.getOriginalFromMemento(memento3);
        System.out.println("恢复第三名的成绩信息:"+original.toString());
        //清空记录下一组
        managerMemento.remove();
    }
    private static void recordResults(Original original,Caretaker managerMemento) {
        //第一名学生成绩
        original.setName("张三");
        original.setTimestamp(2330);
        //创建一个备份类
        Memento memento1 = original.createMemento();
        //备份类存入 管理类中
        managerMemento.add(memento1);
        //第二名学生成绩
        original.setName("李四");
        original.setTimestamp(2550);
        //创建一个备份类
        Memento memento2 = original.createMemento();
        //备份类存入 管理类中
        managerMemento.add(memento2);
        //第三名学生成绩
        original.setName("王五");
        original.setTimestamp(2560);
        //创建一个备份类
        Memento memento3 = original.createMemento();
        //备份类存入 管理类中
        managerMemento.add(memento3);
    }
}

【5】结果展示: 备份者模式思想相对简单,主要查看细节上的实现。备份类相对简单,就一个普通类。但是目标类,提供了存储原始对象和获取原始对象的方法,是备份者模式的精华所在。

恢复目标类的记录值Original [name=王五, timestamp=2560]
恢复第一名的成绩信息:Original [name=张三, timestamp=2330]
恢复第三名的成绩信息:Original [name=王五, timestamp=2560]

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

相关文章

  • Java并发控制机制详解

    Java并发控制机制详解

    这篇文章主要为大家详细介绍了Java并发控制机制,什么是Java并发控制机制,Java并发控制机制的作用,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Spring系列之事物管理

    Spring系列之事物管理

    这篇文章主要介绍了Spring系列之事物管理,文中通过示例代码介绍的非常详细,对大家学习或者使用spring方面知识具有一定的参考学习价值,需要的朋友们一起学习学习吧
    2021-09-09
  • SpringSecurity登录使用JSON格式数据的方法

    SpringSecurity登录使用JSON格式数据的方法

    这篇文章主要介绍了SpringSecurity登录使用JSON格式数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • SpringMVC Hibernate与JPA使用教程

    SpringMVC Hibernate与JPA使用教程

    这篇文章主要介绍了SpringMVC Hibernate与JPA,在正式进入Hibernate的高级应用之前,需要了解声明是数据模型与领域模型,这两个概念将会帮助我们更好的理解实体对象的关联关系映射
    2022-12-12
  • 深入理解@component与@Configuration注解

    深入理解@component与@Configuration注解

    这篇文章主要介绍了深入理解@component与@Configuration注解,从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被扫描,并用于构建bean定义,初始化Spring容器,需要的朋友可以参考下
    2023-11-11
  • SpringCloud微服务架构实战之微服务治理功能的实现

    SpringCloud微服务架构实战之微服务治理功能的实现

    这篇文章主要介绍了SpringCloud微服务架构实战之微服务治理,这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、服务降级和故障转移、链路跟踪、服务监控等,需要的朋友可以参考下
    2022-02-02
  • SpringBoot如何使用过滤器进行XSS防御

    SpringBoot如何使用过滤器进行XSS防御

    想对全局的请求都进行XSS防御可以使用servlet中的过滤器或者spring mvc中的拦截器,下面我们就来看看如何使用servlet中的过滤器进行XSS防御吧
    2024-11-11
  • 从配置到监控详解SpringBoot微服务性能优化实践指南

    从配置到监控详解SpringBoot微服务性能优化实践指南

    Spring Boot凭借快速开发、自动化配置和丰富生态,被广泛用于构建微服务,本指南将聚焦Spring Boot微服务性能优化,希望可以帮助大家掌握性能调优要点
    2025-08-08
  • springcloud微服务之Eureka配置详解

    springcloud微服务之Eureka配置详解

    这篇文章主要介绍了springcloud微服务之Eureka配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java判断字符串是否是整数或者浮点数的方法

    Java判断字符串是否是整数或者浮点数的方法

    今天小编就为大家分享一篇Java判断字符串是否是整数或者浮点数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论