概述
备忘录模式是一种行为模式,该模式业内关于保存对象当前状态,并且之后可以再次恢复到此状态。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。
定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
使用场景
- 需要保存一个对象在某一个时刻的状态或部分状态
- 如果需要一个接口来让其她对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界,直接访问其内部状态,通过中间对象可以间接访问其内部状态。
UML类图
代码示例
示例代码十分简单,Originator类中的state变量需要备份,以便在需要的时候恢复;Memento类中,也有一个state变量,用来存储Originator类中state变量的临时状态;而Caretaker类就是用来管理备忘录类的,用来向备忘录对象中写入状态或者取回状态。
Originator类:
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
/**
* 创建备忘录
*/
public Memento createMemento() {
return new Memento(state);
}
/**
* 恢复之前保存的状态
*/
public void restoreState(Memento memento) {
setState(memento.getState());
}
@Override
public String toString() {
return "Originator{" +
"state='" + state + '\'' +
'}';
}
}
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;
}
@Override
public String toString() {
return "Memento{" +
"state='" + state + '\'' +
'}';
}
}
Caretaker类:
public class Caretaker {
// 备忘录
Memento mMemento;
/**
* 存档
*/
public void archive(Memento memento) {
this.mMemento = memento;
}
/**
* 获取存档
*/
public Memento getmMemento() {
return this.mMemento;
}
}
Test类:
public class TestMemento {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setState("状态 - A");
System.out.println("当前状态:" + originator.getState());
Caretaker caretaker = new Caretaker();
// 当前状态存档
caretaker.archive(originator.createMemento());
// 变更状态
originator.setState("状态 - B");
System.out.println("当前状态:" + originator.getState());
// 恢复之前保存的状态
originator.restoreState(caretaker.getmMemento());
System.out.println("存档的状态:" + caretaker.getmMemento().toString());
System.out.println("当前状态:" + originator.getState());
}
}
测试结果:
当前状态:状态 - A
当前状态:状态 - B
存档的状态:Memento{state='状态 - A'}
当前状态:状态 - A