天天看點

設計模式 -- 備忘錄模式

定義:

記憶一個對象的内部狀态,為了允許使用者取消不确定或者錯誤的操作,能夠恢複到以前的狀态。

優缺點:

優點:

1,提供可恢複機制,能夠讓使用者恢複到曆史某個狀态。

2,封裝細節的操作。

缺點:

貌似犯了設計模式的通病,就是類的數量增加,消耗系統資源和性能。

在android源碼中的使用:

activity源碼檢視:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/Activity.java#Activity.onSaveInstanceState%28android.os.Bundle%29

activity狀态儲存:onsaveInstanceState()和onRestoreInstanceState().

onSaveInstanceState()裡面:

1,存儲視窗的視圖樹狀态。

2,存儲fragment的狀态。

3,調用activity的activityLifecycleCallbacks的onSaveInstance函數進行狀态存儲。

如下是2.3的activity裡面onSaveInstanceState裡面的方法,儲存存儲視窗的視圖狀态。

 mContentParent.saveHierarchyState(states):

會去調用  dispatchSaveInstanceState(container)方法:看這個方法裡面實作:

如無id,不儲存狀态,否則将狀态存儲在container裡面。

存儲資訊的bundle存儲在哪裡?

onsaveInstanceState是在activity銷毀之前,onstop之前進行的。

ActivityThread的performStopActivity裡面通過調用callCallActivityonSaveInstanceState()來執行onsaveInstance

performStopActivityInner(r, null, false, saveState):

callCallActivityOnSaveInstanceState:

 上面是儲存狀态,那麼恢複狀态呢?

當activity重新啟動的時候,會去查詢activityClientRecord,如果存在狀态資訊,就會調用onRestoreInstanceState()

代碼可點選檢視:http://grepcode.com/file_/repo1.maven.org/maven2/org.robolectric/android-all/5.0.0_r2-robolectric-1/android/app/ActivityThread.java/?v=source

Activity負責存儲,恢複UI狀态,也就是說負責存儲備忘錄,不對備忘錄資訊進行任何操作,隻是傳遞給其他對象;

activity,View,ViewGroup存儲對象的狀态,建立備忘錄,可以記錄,恢複備忘錄狀态;

Bundle存儲activity,View,ViewGroup的UI狀态,存儲備忘錄狀态。

2015年12月27日23:08:44更新

寫個java的例子出來,主要涉及到狀态的儲存和恢複,使用備忘錄模式實作:

首先原始類,要備份的對象類:

備忘錄類,比起上面的類,少了建立備份和設定備份資料的方法:

 Caretaker類:負責存儲備忘錄,不對内容進行操作和通路,将備忘錄傳遞給其他對象。

測試類Test.java:

運算結果:

 其他部落格看到的一篇文章,講的有意思,可以去看看:http://www.blogjava.net/amigoxie/archive/2007/04/12/110031.html

繼續閱讀