类图
定义
在不破坏封装性的前提下,捕获一个对象内部状态,并在该对象之外保存这个状态。
这样以后就 可将该对象恢复到原先保存的状态
使用场景
- 需要保存和恢复数据的相关状态场景
- 提供一个可回滚操作
- 需要监控的副本场景中
- 数据库连接的事务管理就是用的备忘录模式
注意事项
备忘录的性能:不要在频繁建立备份的场景中使用备忘录模式以免控制不了备忘录建立的对象数量,而且大对象的简历需要资源
备忘录类
public class Memento {
/**
* 备忘录状态
*/
private String state = "";
public Memento(String _state) {
this.state = _state;
}
/**
* 获取状态
*
* @return 状态
*/
public String getState() {
return state;
}
/**
* 设置状态
*
* @param state 状态
*/
public void setState(String state) {
this.state = state;
}
}
发起人角色
public class Originator {
/**
* 内部状态
*/
private String state = "init";
/**
* 获取状态
*
* @return 状态
*/
public String getState() {
return state;
}
/**
* 设置状态
*
* @param state 状态
*/
public void setState(String state) {
this.state = state;
}
/**
* 创建一个备忘录
*
* @return 备忘录
*/
public Memento createMemento() {
return new Memento(state);
}
/**
* 回复一个备忘录
*
* @param memento 备忘录
*/
public void restoreMemento(Memento memento) {
setState(memento.getState());
}
}
备忘录管理者
public class Caretaker {
/**
* 备忘录对象
*/
private Memento memento;
/**
* 获取备忘录对象
*
* @return 备忘录对象
*/
public Memento getMemento() {
return memento;
}
/**
* 设置备忘录对象
*
* @param memento 备忘录对象
*/
public void setMemento(Memento memento) {
this.memento = memento;
}
}
场景类
public class Client {
public static void main(String[] args) {
// 定义发起人
Originator originator = new Originator();
// 定义备忘录管理者
Caretaker caretaker = new Caretaker();
// 创建一个备忘录
caretaker.setMemento(originator.createMemento());
// 读取备忘录内容
System.out.println("备忘录状态:" + caretaker.getMemento().getState());
System.out.println("发起人状态:" + originator.getState());
// 改变发起人内容
originator.setState("new state");
// 读取发起人内容
System.out.println("发起人状态:" + originator.getState());
// 恢复一个备忘录
originator.restoreMemento(caretaker.getMemento());
System.out.println("发起人状态:" + originator.getState());
}
}
运行结果
备忘录状态:init
发起人状态:init
发起人状态:new state
发起人状态:init