1.定义说明
- 行为模式,用于保存对象的内部状态(备忘录角色),以便可以再恢复到当前状态
2.UML类图
- 角色说明
Originator : 负责创建一个备忘录
Memoto : 备忘录角色,记录需要记录的具体属性参数
CareTaker : 只负责存储备忘录,不对Memoto的内容进行操作和访问 - 要点说明
Memoto备忘录角色只是一个对象的内部状态的快照
3.示例代码
- GameOriginator 负责创建备忘录
public class GameOriginator {
private static final String TAG = "GameOriginator";
private int version;
private String name;
private int mode;
private int status;
private int progress;
public void play() {
Log.d(TAG, "play");
}
public void quit() {
Log.d(TAG, "quit");
}
public Memento createMemento() {
Memento memento = new Memento();
memento.mode = mode;
memento.status = status;
memento.progress = progress;
return memento;
}
public void restore(Memento memento) {
this.mode = memento.mode;
this.status = memento.status;
this.progress = memento.progress;
}
}
- Memento 备忘录角色
public class Memento {
// 模式
public int mode;
// 状态
public int status;
// 进度
public int progress;
}
- CareTaker 负责存储备忘录
public class CareTaker {
private Memento memento;
public void storeMemento(Memento memento) {
this.memento = memento;
}
public Memento restoreMemento() {
return memento;
}
}
4.源码中应用
Activity生命周期中的两个方法就是用于保存、恢复页面的状态:
- onSaveInstanceState
当Activity变得容易被系统销毁时,比如横竖屏切换,会回调此方法,用于保存当前页面的状态。 - onRestoreInstanceState
重建后会调用onRestoreInstanceState,通过上面保存的Bundle对象来做一些恢复操作,此处的Bundle不会为空。
5.总结
- 优缺点
优点:提供可以恢复对象内部状态的机制,实现Memoto的封装,
用户无需关心状态的保存细节
缺点:增加额外的对象,会消耗一定的内存(感觉有点苛刻,需求还是最重要的)