什么是备忘录模式
所谓备忘录模式,就是在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后可将这个对象恢复到原先保存的状态的设计模式。
备忘录模式的实现方式
备忘录模式的实现方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。
民族英雄文天祥《正气歌》记载了一个“在齐太史简”的故事,我们先定义一个历史类:
public class History {
private String[] recorders = {"太史伯","太史仲","太史叔","太史季","南史氏"}; private int record_num = 0;//被崔杼杀害的史官数量 private String truth = "崔杼弑其君";
public History(int record_num) { this.record_num = record_num; }
/** * 发生 */ public void happen(){ Log.e("历史事件发生",truth); }
/** * 记录 */ public Memoto record(){ Log.e(recorders[record_num] + "书曰",truth); Memoto memoto = new Memoto(truth); return memoto; }
/** * 史官遇害 */ public void killRecorder(){ truth = "暴病而死"; Log.e("崔杼杀害"+recorders[record_num] + ",妄图篡改历史",truth); }
/** * 前赴后继 */ public void recordAgain(Memoto memoto){ this.truth = memoto.getTruth(); Log.e(recorders[record_num] + "嗣书",truth); }
} |
记载真相的备忘录:
public class Memoto {
private String truth;
public Memoto(String truth) { this.truth = truth; }
public String getTruth() { return truth; } } |
备忘录的操作者Caretaker:
public class Caretaker {
Memoto memoto;
public void archive(Memoto memoto){ this.memoto = memoto; }
public Memoto getMemoto(){ return memoto; }
} |
“在齐太史简”的全过程:
History history_0 = new History(0); history_0.happen();
Caretaker caretaker = new Caretaker();
caretaker.archive(history_0.record()); history_0.killRecorder();
History history_1 = new History(1); history_1.recordAgain(caretaker.getMemoto()); history_1.killRecorder();
History history_2 = new History(2); history_2.recordAgain(caretaker.getMemoto()); history_2.killRecorder();
History history_3 = new History(3); history_3.recordAgain(caretaker.getMemoto()); |
无独有偶,秦始皇灭赵之后第一件事就是把赵国的史书全部烧毁,可是那句“某年月日,秦王为赵王击缻”还是被司马迁记录下来,千古流传,这也是现实中的备忘录模式的功劳。
Android源码中的备忘录模式
(1)onSaveInstanceState
当某个Activity变得容易被系统销毁时,该Activity的onSaveInstanceState方法就会被执行,除非该Activity是被用户主动销毁的。
Android开发中如何利用备忘录模式
(1)备忘录模式给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
(2)备忘录模式实现了信息的封装,使得用户不需要关心状态的保存细节。
需要注意的几个问题
(1)备忘录模式的缺点在于消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。