备忘录模式
在不破坏原封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样,以后就可以将该对象恢复到原先保存的状态。
备忘录模式角色
- 发起人(Originator)角色:该角色记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据;
- 备忘录(Memento)角色:该角色负责存储发起人角色的内部状态,在需要时提供发起人需要的备份状态数据;
- 负责人(Caretaker)角色:该角色对备忘录角色进行管理,保存和提供备忘录。
使用场景
- 需要保存和恢复数据的相关状态场景;
- 提供一个可回滚的操作;
- 需要监控副本的场景;
- 数据库连接的事务管理使用的就是备忘录模式。
<span style="font-size:18px;">package memento;
/**
* 发起人,该角色记录当前状态,负责定义哪些属于备份范围
* 负责创建和恢复备份数据
*
*/
public class Originator {
//内部状态
private String state = "";
//创建备忘录
public Memento createMemento(){
return new Memento(this.state);
}
//恢复一个备忘录
public void restoreMemento(Memento memento){
this.setState(memento.getState());
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
</span>
<span style="font-size:18px;">package memento;
/**
* 备忘录,该角色存储发起人角色的内部状态,在需要时提供
* 发起人所需要的内部状态数据
*
*/
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;
}
}
</span>
<span style="font-size:18px;">package memento;
/**
* 负责人,负责管理发起人、备忘录
*
*/
public class Caretaker {
//备忘录对象
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
</span>
<span style="font-size:18px;">package memento;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建发起人角色
Originator originator = new Originator();
//定义负责人
Caretaker care = new Caretaker();
//创建备忘录对象
care.setMemento(originator.createMemento());
//恢复一个备忘录状态
originator.restoreMemento(care.getMemento());
}
}
</span>