备忘录设计模式(MementoDesignPattern)也叫作快照(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 File类的概述及常用方法使用详解 2023-05-18
- JVM分析之类加载机制详解 2023-04-06
- 一文了解Java 线程池的正确使用姿势 2023-06-17
- Java使用EasyExcel进行单元格合并的问题详解 2023-01-18
- SpringBoot配置文件中密码属性加密的实现 2023-03-11
- 全局记录Feign的请求和响应日志方式 2023-01-09
- Project Reactor源码解析publishOn使用示例 2023-04-12
- 用java实现扫雷游戏 2022-12-06
- 工厂方法在Spring框架中的运用 2023-06-23
- Java去掉小数点后面无效0的方案与建议 2023-02-18