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