备忘录模式(memento)
行为模式的一种。
意图:
Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later.
在不破坏封装的前提下,捕获和外化一个对象的内部状态,这样以后就可以将该对象恢复到原先保存的状态。
结构图
参与者
Memento (SolverState)
- 存储 Originator 对象的内部状态。Memento可以存储为由Originator自行决定是否需要或多或少的Originator的内部状态。
- 防止发起者以外的对象访问。Memento实际上有两个接口。Caretaker看到了一个狭窄的界面Memento——它只能将 memento 传递给其他对象。Originator,在相比之下,看到一个广泛的界面,一个允许它访问所有必要的数据的界面将自身恢复到之前的状态。理想情况下,只有产生memento的Originator 才被允许访问 memento 的内部状态。
Originator(ConstraintSolver)
- 创建一个包函当前内部状态快照的memento
- 用memento恢复其内部状态
Caretaker (undo mechanism)
- 负责memento的保存
- 从不操作和检查memento的内容
public class Caretaker {
Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = 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;
}
}
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
Memento creatMemento(){
return new Memento(state);
}
void setMemento(Memento m){
this.setState(m.getState());
}
@Override
public String toString() {
return "Originator{" +
"state='" + state + '\'' +
'}';
}
}
测试类
public class test {
public static void main(String[] args) {
Originator or = new Originator();
or.setState("s1");
System.out.println("原始状态"+or.toString());
Memento m = or.creatMemento();
System.out.println("开始备份");
Caretaker cr = new Caretaker();
cr.setMemento(m);
or.setState("s2");
System.out.println("修改状态为"+or.toString());
or.setMemento(cr.getMemento());
System.out.println("恢复状态"+or.toString());
}
}
执行结果
参考文档http://www.javier8a.com/itc/bd1/articulo.pdf