1.1定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,之后就可以将该对象恢复到原先保存的状态。
备忘录模式(Memento Pattern)是一种弥补缺陷的模式,能够在失败的操作后读档
1.2应用场景
- 需要保存和恢复数据的场景
- 需要提供一个可回滚(rollback)的操作
- 需要监控的副本场景
- 数据库连接的事务管理就是使用备忘录模式
1.3备忘录模式的角色
- Originator发起人。记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据
- Memento备忘录角色。负责Originator当前状态的快照,之后需要时提供数据回滚
- Caretaker备忘录管理员。管理Memento角色,将发起人对备忘录角色的使用权交给管理员。
2.1发起人
/**
* 发起人
*/
public class Man {
private String state;
/**
* 认识女孩后状态的变化
*/
public void changeState() {
setState("心情突然变得不好");
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
/**
* 保存一个备份
*
* @return 备忘录
*/
public Memento createMemento() {
return new Memento(this.state);
}
/**
* 恢复一个备份
*/
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
}
2.2备忘录角色
/**
* 备忘录角色
*/
public class Memento {
/**
* 状态
*/
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
2.3备忘录管理员——Caretaker
/**
* 备忘录管理员
*/
public class Caretaker {
/**
* 备忘录角色
*/
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
2.4入口类方法
public static void main(String[] args) {
// 定义发起人
Man originator = new Man();
Caretaker caretaker = new Caretaker();
// 初始化状态
originator.setState("刚刚认识很忐忑!");
System.out.println("初始化状态为:" + originator.getState());
// 记录状态
caretaker.setMemento(originator.createMemento());
originator.changeState();
System.out.println("修改后的状态:" + originator.getState());
// 恢复原有状态
originator.restoreMemento(caretaker.getMemento());
System.out.println("恢复后的状态:" + originator.getState());
}
结果
3.小结
- 添加了备忘录角色Memento和备忘录管理员Caretaker
- 发起人Originator在某个时刻发起备份,管理员负责管理备份。
- 发起人发起回滚时,管理员调出先前记录的备忘录,提供给发起人以回滚。