一、定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后就可将该对象恢复到原先保存的状态。
二、使用场景
需要保存一个对象在某一个时刻的状态或部分状态。
三、UML类图
备忘录模式
Originator:负责创建一个备忘录,可以记录、恢复自身的内部状态。
Memento:备忘录,用于存储Originator的内部状态。
Caretaker:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。
四、实现
//发起者
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 setMemento(Memento memento) {
state = memento.getState();
}
public void show() {
System.out.println("state: " + state);
}
}
//备忘录
public class Memento {
private Sting state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
//管理者
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
//客户端
public class Client {
public static void main(String[] args) {
Originator o = new Originator();
o.setState("on");
o.show();
Caretaker c = new Caretaker();
c.setMemento(o.createMemento());
o.setState("off");
o.show();
o.setMemento(c.getMemento())
o.show();
}
}
五、应用
Android Activity 状态保存与恢复
在Android中,当某个Activity变得容易被系统销毁时(除非该Activity是被用户主动销毁的,如当用户按Back键),Activity#onSaveInstanceState方法就会被回调(在Activity#onStop方法回调之前),用于存储窗口的视图树的状态、存储Fragment的状态等。在重新启动该Activity时会判断是否有存储Activity的状态,如果有则回调Activity#onRestoreInstanceState方法恢复状态。这样就保证了在非正常情况退出Activity时不会丢失数据的情况,很好地提升了用户体验。
在这个过程中,ActivityThread扮演Caretaker角色,负责存储、恢复UI的状态信息;Activity、Fragment、View、ViewGroup等对象扮演Orginator角色,也就是需要存储状态的对象;Bundle则扮演Memento角色。
六、总结
备忘录模式是在不破坏封装的条件下,通过备忘录对象存储另外一个对象内部状态的快照,在将来合适的时候把这个对象还原到存储起来的状态。