天天看点

设计模式 -- 备忘录模式

定义:

记忆一个对象的内部状态,为了允许用户取消不确定或者错误的操作,能够恢复到以前的状态。

优缺点:

优点:

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

继续阅读