1.观察者模式
1.1 定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象得到通知并被自动更新。
1.2 UML
说明:
- 1.subject 抽象主题,也就是被观察(observable)角色,抽象主题角色把所有观察者对象引用到一个集合
- 2.concteteSubject:具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发送改变时,通知注册过观察者发出通知,也叫具体被观察者。
- 3.observer:抽象观察者,该角色是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改时更新自己
- 4.concreteObserver:具体的观察者。
1.3.使用场景
- 1.关联行为场景,需要注意的是关联行为是可以分拆的,而不是组合关系
- 2.事件多级触发场景
- 3.跨系统的消息交换场景,如消息队列,事件总线的处理机制
1.4 两种模式
推模型:主题对象向观察者推主题的详细信息,不管观察者是否需要,推送的信息通畅是主题对象的全部或者部分
拉模型:主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当是观察者从主题中拉对象数据。一般这种模型的实现,会包主题对象通过update方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用获取。
注意: 就是是否把整体传递给观察者
1.5 代码实现
1.抽象subject
2.具体实现 concreteSubject
3.抽象observer
4.具体的observer
5.调用方法
1.6 android源码中的实现
BaseAdapter
1.抽象观察者
2.具体实现observer
3.真正的抽象观察者
4.其他需要关键适配的都可以继承这个类
5.以ListView的setAdapter为例。
6.AdapterDataSetObserver 在ListView父类AbsListView中定义
AdapterDataSetObserver是继承DataSetObserver并实现了。
8.流程
在RecyclerView中原理是一样的
- 1.在swapAdapter(Adapter adapter, boolean removeAndRecycleExistingViews)中 adapter是Adapter<VH extends ViewHolder>。
- 2.在其中定义了一个抽象被观察者AdapterDataObservable mObservable = new AdapterDataObservable() 这个被观察者继承AdapterDataObservable extends Observable<AdapterDataObserver>。
- 3.AdapterDataObserver 就是抽象观察者
- 4.RecyclerViewDataObserver是具体的观察者
2.备忘录模式
2.1 定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态。
2.2 UML
提供比较完备的操作状态的方法,我们称它为宽接口;而另一个则可以只是一个标示,我们称它为窄接口。
备忘录角色对任何对象都提供一个接口,即宽接口,备忘录角色的内部所存储的状态就对所有对象公开。因此这个实现又叫做“白盒实现”。
“白盒”实现将发起人角色的状态存储在一个大家都看得到的地方,因此是破坏封装性的。但是通过程序员自律,同样可以在一定程度上实现模式的大部分用意。因此白箱实现仍然是有意义的。
备忘录角色对发起人(Originator)角色对象提供一个宽接口,而为其他对象提供一个窄接口。这样的实现叫做“黑盒实现”。
- Originator:负责创建一个备忘录,可以记录和恢复自身的内部状态
- Memento:备忘录角色,用于存储originator的内部状态,并且可以防止originator之外的Memento访问
- Careaker:负责 存储备忘录,不能对备忘录的内容进行操作和访问,只能将备忘录传递给其他对象。
2.3 代码实现
A.白盒
1.创建备忘角色
2.创建originator负责对数据的操作(保存和恢复)
3.创建Caretaker 负责对备忘录数据的存储和获得
4.调用
B.黑盒实现
1.创建备忘录memento 空接口,具体的实现在Originator中
public interface MementoIF {
}
2.创建Originator
3.创建 caretaker
4.调用
2.4 android源码中的使用
activity中的onSaveInstanceState()
在这个过程中,activity扮演了Caretaker角色,负责存储,恢复UI的状态信息;Activity,Fragment,view,viewgroup等对象为originator角色,也就是需要存储状态的对象;Memoto则由Bundle类扮演。Activity在停止之前会根据Activity的退出情景来选择是否需要存储状态,在重启Activity时会判断ActivityClientRecord对象中是否存储了Activity的状态,如果含有则调用onRestoreInstanceState函数,从而使得Activity的UI效果与上次保持一致。
onSaveInstanceState的调用时机:
- 当用户按下home键
- 长按home键,选择其他的程序时
- 按下电源键关闭屏幕时
- activity中启动一个新的Activity时
- 屏幕方向切换时,如果从竖屏切换到横屏时
- 电话打入等情况时