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

初识设计模式 - 备忘录模式

简介

备忘录设计模式(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;
}
}

http://www.kler.cn/a/9485.html

相关文章:

  • 1.两数之和-力扣(LeetCode)
  • Bugku CTF_Web——点login咋没反应
  • SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间
  • 半导体企业如何利用 Jira 应对复杂商业变局?
  • 《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
  • python高效处理大数据:将Excel10万数据分批插入MySQL数据库的实战代码
  • 面试官灵魂拷问:为什么 SQL 语句不要过多的 join?
  • MyBatis-Plus的基本操作
  • 【AI绘图学习笔记】Latent Diffusion Model(上)——论文解读
  • 大模型“云上经济”之权力游戏
  • sipp3.6带媒体测试方案
  • 【华为OD机试真题】简单的自动曝光(javapython)
  • stata数据处理
  • 【Vite】环境变量的配置与使用
  • 认证认可机构收费项目和标准
  • 深拷贝和浅拷贝
  • Python 中 SyntaxError: ‘yield‘ outside function 错误
  • 算法与数据结构 | 时间复杂度、排序、异或位运算
  • ROS入门教程(一)Python实现Hello world
  • 前端架构师-week3-大厂怎么做项目
  • vue dom 更新nextTick
  • restTemplate发送multipartFile和String混合参数及接收
  • 素数环PrimeRing [3*]
  • redis 基础数据结构
  • 基于多种算法实现鸢尾花聚类
  • Spark SQL实战(04)-API编程之DataFrame