1. 定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
2. 使用的原因
想要恢复对象某时的原有状态。
3. 适用的情况举例
有很多备忘录模式的应用,只是我们已经见过,却没细想这是备忘录模式的使用罢了,略略举几例:
eg1. 备忘录在jsp+javabean的使用:
在一系统中新增帐户时,在表单中需要填写用户名、密码、联系电话、地址等信息,如果有些字段没有填写或填写错误,当用户点击“提交”按钮时,需要在新增页面上保存用户输入的选项,并提示出错的选项。这就是利用JavaBean的scope="request"或scope="session"特性实现的,即是用备忘录模式实现的。
eg2. 修理汽车的刹车时。首先移开两边的挡板,露出左右刹车片。只能卸下一片,这时另一片作为一个备忘录来表明刹车是怎样安装的。在这片修理完成后,才可以卸下另一片。当第二片卸下时,第一片就成了备忘录。
eg3. 都说人生没有后悔药可买,我们都在为所做的事付出着代价,但在软世界里却有“后悔药”,我改变了某东西的某些状态之后,只要我们之前保存了该东西的某状态,我们就可以通过备忘录模式实现该东西的状态还原,其实这何尝不是一个能使时光倒流的“月光宝盒”,总“神奇”一词了得。
4. 类图结构及说明
(1)类图如下所示:

立即学习“Java免费学习笔记(深入)”;
(2)类说明
(i)Memento:备忘录角色, 主要负责的工作如下:
将发起人对象的内部状态存储起来;
可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。
(ii)Originator:发起人角色,主要完成如下工作:
创建一个含有当前的内部状态的备忘录对象;
使用备忘录对象存储其内部状态。
(iii)Caretaker:负责人角色,完成工作如下:
负责保存备忘录对象;
不保存备忘录对象的内容。
5.实例
/**
* 数据对象
*/
public class DataState {
private String action;
public void setAction(String action) {
this.action = action;
}
public String getAction() {
return action;
}/**
* 一个保存另外一个对象内部状态拷贝 的对象.这样以后就可以将该对象恢复到原先保存的状态.
*/
import java.io.File;
import java.io.Serializable;
public class Memento implements Serializable {
/*private int number;
private File file = null;
public Memento(Originator o) {
this.number = o.getNumber();
this.file = o.getFile();
}
public int getNumber() {
return this.number;
}
public void setNumber(int number) {
this.number = number;
}
public File getFile() {
return this.file;
}
public void setFile(File file) {
this.file = file;
}
*/
private DataState state;
public Memento(Originator o) {
this.state = o.getState();
}
public DataState getState() {
return state;
}
public void setState(DataState state) {
this.state = state;
}
}public class Originator {
/* private int number;
private File file = null;
public Originator() {
}
// 创建一个Memento,将自身作为参数传入
public Memento getMemento() {
return new Memento(this);
}
// 从Memento中取出保存的数据,恢复为原始状态
public void setMemento(Memento m) {
number = m.getNumber();
file = m.getFile();
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}*/
private DataState state;
public Originator() {
}
public Originator(DataState state) {
this.state = state;
}
// 创建一个Memento,将自身作为参数传入
public Memento getMemento() {
return new Memento(this);
}
// 从Memento中取出保存的数据,恢复为原始状态
public void setMemento(Memento m) {
/*
* getMemento() 创建的对象,保存在某个容器里,
* 当需要恢复时,将其传入当前方法, 再使用getState(),得出
*/
this.state = m.getState();
}
public DataState getState() {
return state;
}
public void setState(DataState state) {
this.state = state;
}
}/*
* Originator用于 加载数据, 建立Memento对象,及通过Memento恢复原始数据
*/
public class Test {
public static void main(String[] args) {
// Originator originator = new Originator();
// originator.setNumber(8);
//
// Memento memento = originator.getMemento();
// System.out.println(memento.getNumber());
DataState state = new DataState();
state.setAction("copy a character");
Originator originator = new Originator();
System.out.println("创建原始数据");
originator.setState(state);
System.out.println("创建备忘录对象, 保存原始数据状态");
Memento memento = originator.getMemento();
System.out.println("创建了一个新数据");
originator.setState(new DataState());
System.out.println("创建新数据后:" + originator.getState().getAction());
/*
* memento 需要保存在某地,需要时取出,以恢复它内部所保存的数据
*/
System.out.println("创建新数据后,恢复原数据");
originator.setMemento(memento);
System.out.println(originator.getState().getAction());
}
}
打印:
创建原始数据 创建备忘录对象, 保存原始数据状态 创建了一个新数据 创建新数据后:null 创建新数据后,恢复原数据 copy a character
更多详解备忘录模式及其在Java设计模式编程中的实现相关文章请关注PHP中文网!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
C++高性能并发应用_C++如何开发性能关键应用
Java AI集成Deep Java Library_Java怎么集成AI模型部署
Golang后端API开发_Golang如何高效开发后端和API
Python异步并发改进_Python异步编程有哪些新改进
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
Java GraalVM原生镜像构建_Java怎么用GraalVM构建高效原生镜像
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
C++现代C++20/23/26特性_现代C++有哪些新标准特性如modules和coroutines
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号