一、定義
在不破壞封閉的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,以后就可將該對象恢復到原先保存的狀態。
二、使用場景
需要保存一個對象在某一個時刻的狀態或部分狀態。
三、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角色。
六、總結
備忘錄模式是在不破壞封裝的條件下,通過備忘錄對象存儲另外一個對象內部狀態的快照,在將來合適的時候把這個對象還原到存儲起來的狀態。