Java设计模式——备忘录模式

2023-11-05

文章目录

备忘录模式

主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。做个图来分析一下:
在这里插入图片描述
Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。Memento类是备忘录类,Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解。直接看源码:

public class Original {  
      
    private String value;  
      
    public String getValue() {  
        return value;  
    }  
  
    public void setValue(String value) {  
        this.value = value;  
    }  
  
    public Original(String value) {  
        this.value = value;  
    }  
  
    public Memento createMemento(){  
        return new Memento(value);  
    }  
      
    public void restoreMemento(Memento memento){  
        this.value = memento.getValue();  
    }  
}  
public class Memento {  
      
    private String value;  
  
    public Memento(String value) {  
        this.value = value;  
    }  
  
    public String getValue() {  
        return value;  
    }  
  
    public void setValue(String value) {  
        this.value = value;  
    }  
}  
public class Storage {  
      
    private Memento memento;  
      
    public Storage(Memento memento) {  
        this.memento = memento;  
    }  
  
    public Memento getMemento() {  
        return memento;  
    }  
  
    public void setMemento(Memento memento) {  
        this.memento = memento;  
    }  
}  

测试类:

public class Test {  
  
    public static void main(String[] args) {  
          
        // 创建原始类  
        Original origi = new Original("egg");  
  
        // 创建备忘录  
        Storage storage = new Storage(origi.createMemento());  
  
        // 修改原始类的状态  
        System.out.println("初始化状态为:" + origi.getValue());  
        origi.setValue("niu");  
        System.out.println("修改后的状态为:" + origi.getValue());  
  
        // 回复原始类的状态  
        origi.restoreMemento(storage.getMemento());  
        System.out.println("恢复后的状态为:" + origi.getValue());  
    }  
}  

简单描述下:新建原始类时,value被初始化为egg,后经过修改,将value的值置为niu,最后倒数第二行进行恢复状态,结果成功恢复了。其实我觉得这个模式叫“备份-恢复”模式最形象。

介绍
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

如何解决:通过一个备忘录类专门存储对象状态。

关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。

优点: 1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点:消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。

注意事项: 1、为了符合迪米特原则,还要增加一个管理备忘录的类。 2、为了节约内存,可使用原型模式+备忘录模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式——备忘录模式 的相关文章

  • 在云服务器存储数据的10个好处

    本文编辑 富哥 云服务器已经成为最适合在线存储数据的选项 在较早时期 大多数公司依靠内部服务器来存储他们不断增长的数据和在线文件 但今天将数据存储在在线的云服务器中已经成为新的趋势 因为它允许无限存储 将所有数据存储在云中最好的方面是确保可
  • Java中类的构成

    Java中的每个类一般包含属性 构造器 块 方法 内部类五部分 属性 用来定义对象的数据 构造器 构造器也是方法 每一个类中都一定会有构造器 包含有参构造器和无参构造器每一个对象在创建的时候都会调用构造器 如果没有构造器 系统将提供一个默认
  • 十大经典排序算法总结

    https blog csdn net hellozhxy article details 79911867
  • AI嵌入式全景:各厂商、系列和开发工具的综合概览

    要看几个方面 1 算力 2 支持何种模型 3 是否支持可视化的窗口系统 一般而言各个平台均采用linux操作系统 官方提供对应SDK 安装好后可使用硬件加速资源 而且如果要使用其硬件加速 一般都要完成模型转换 将模型转为该平台所特有的格式
  • Spring Boot 学习研究笔记(十) -SpringBoot JAP 踩坑总结

    SpringBoot JAP 踩坑总结 一 JSON 字段映射处理流程 1 实现类型转换接口 package com call show common utils import com fasterxml jackson core Json

随机推荐

  • 最简单的鼠标放置悬停显示省略的内容,为标签的title赋值

    翻了一下午没看到能看懂的代码 对于我这个后台开发实在天书一般 原始需求为 内容过长显示为省略号 鼠标放置时再将全部内容悬浮展示出来 内容是放置在p标签中的 设置一下style即可 注意这四个属性缺一不可 p style width 100
  • 雪花算法记录

    引子 伴随着业务的日渐庞大 单库单表的数据库可能无法支持业务的读写 需要对数据库进行分库分表 原来数据库中 通常使用自增id的方式生成主键 分库分表之后 如果仍然采用原来的方式 在多个表之间主键会发生重复 分库分表后 如何保证多张表中的 i
  • webpack5+mockjs

    上篇提到升级 vue cli 5 0 1后 发现webpack 是v5 之前配置devServer after异常 于是认真看了一下文档 webpack v5文档 v5的devServer去掉了get和after 添加了setupMiddl
  • 日期的生成

    获取系统当前时间 日期类型为timestamp 日期格式为2010 11 04 16 19 42 方法1 Timestamp d new Timestamp System currentTimeMillis 方法2 Date date ne
  • 实对称矩阵的性质_今天行列式的矩阵是一个实对称矩阵, 主对角线是同一个元素, 其余位置是另一元素。该矩阵的行列式有相当好的性质, 同学们要加以记忆...

    行列式计算 5 01 前言 1 今天我们继续讨论特殊行列式的计算思路与方法 今天这组题的行列式的矩阵是一个实对称矩阵 主对角线是同一个元素 其余位置是另一元素 该矩阵的行列式有相当好的性质 需要同学们加以记忆 2 第1题 第一个行列式的计算
  • MyBatis - 14 - 分页插件的配置及使用

    文章目录 1 分页插件配置 1 在pom xml中添加依赖 2 在MyBatis的核心配置文件中配置插件 2 分页插件的使用 回顾Mysql分页功能 MyBatis分页插件的使用 测试显示第1页 每页显示4条数据 打印page对象 测试获取
  • java Collection和Map接口的区别

    一 Collection接口 Collection是最基本的集合接口 一个Collection代表一组Object 即Collection的元素 Elements 一些Collection允许相同的元素而另一些不行 一些能排序而另一些不行
  • 荔枝派Zero(全志V3S)驱动开发之hello驱动程序

    文章目录 前言 一 设备驱动分类 二 字符设备驱动简介 三 字符设备驱动开发 1 APP打开的文件在内核中如何表示 2 编写驱动程序的步骤 3 hello 驱动程序编写 lt 1 gt 试验程序编写 lt 2 gt 测试程序编写 lt 3
  • Maven的Pom文件中的隐式依赖导致Jar包冲突的问题

    分享一下我老师大神的人工智能教程 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 在一次的maven项目中遇到这样一个bug 编译器没有报什么错 但无法编
  • python爬取boss直聘招聘信息_python学习之路-爬取boss直聘的岗位信息

    背景 想了解从事python相关岗位需要具备什么技能 于是就想从招聘网站上的职位需求入手 把信息获取下来后 生成词云 这样就能很直观的看出来哪些技能是python相关岗位需要具备的了 技术概览 scrapy request wordclou
  • 面试官:说一下单点登录的几种实现方式

    Java面试笔试面经 Java技术每天学习一点 Java面试 关注不迷路 作者 张永恒 来源 https www cnblogs com yonghengzh p 13712729 html 在 B S 系统中 登录功能通常都是基于Cook
  • centos ip 没有显示

    进入 cd etc sysconfig network scripts 编辑网卡设置 我的网卡默认是ifcfg ens33 有的网卡默认是ifcfg eth0 执行 vi ifcfg ens33 将onboot no 改为onboot ye
  • MPU6500驱动调试笔记(STM32F407+SPI)

    一 问题背景 本来最开始实验室使用MPU6050芯片 采集陀螺仪原始数据做生理信号采集 但算法发现用IIC接口采样率 200hz 达不到要求 故寻找同类型支持SPI协议的芯片去替代 发现了这块MPU6500 还便宜 就用起来 在读写寄存器费
  • ST 电机控制工作台帮助文档翻译 之 STM32F3x 的 OCP 和 OVP(使用嵌入式模拟的过压保护(仅限 STM32F3x))

    ST 电机控制工作台 使用嵌入式模拟的过压保护 仅限 STM32F3x 图5显示了可以使用 STM32F30x 的内部资源实现的过压保护网络的基本实现 图5 过压保护网络 原理类似于 过流保护
  • linux-目录相关作用

    文章来自狂神老师的笔记 同时会有自己的体会 狂神老师课程的链接 https www bilibili com video BV187411y7hF from search seid 10463862828616102628 注意 linux
  • 基于SpringBoot的实习管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 Vue HTML 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • 一位技术主管的十年编程经验总结 .

    一位技术主管的十年编程经验总结 有天和朋友聊天 朋友是国内一家大型互联网企业的一位技术主管 朋友把他将近十年研发工作积累的心血总结成两点 这两点朋友刚一提出来我并没有马上明白 只是大约有这么一个概念 我还没达到朋友在技术领域的那种高度 不能
  • PAT乙级1041 考试座位号 (15 分)

    1041 考试座位号 15 分 一 问题描述 每个 PAT 考生在参加考试时都会被分配两个座位号 一个是试机座位 一个是考试座位 正常情况下 考生在入场时先得到试机座位号码 入座进入试机状态后 系统会显示该考生的考试座位号码 考试时考生需要
  • 机器学习:Jupyter Notebook中numpy的使用

    一 Jupyter Notebook的魔法命令 模块 方法 或者help 模块 方法 查看模块 方法的解释文档 1 run 机械学习中主要应用两个魔法命令 run timeit 魔法命令格式 命令 run 将模块引用并在Jupyter No
  • Java设计模式——备忘录模式

    文章目录 备忘录模式 备忘录模式 主要目的是保存一个对象的某个状态 以便在适当的时候恢复对象 个人觉得叫备份模式更形象些 通俗的讲下 假设有原始类A A中有各种属性 A可以决定需要备份的属性 备忘录类B是用来存储A的一些内部状态 类C呢 就