谈谈Android中的观察者模式
App研发组 匡仁锦
一、设计模式概念回顾
二、观察者模式概述
三、Android源码中观察者模式代码
四、观察者模式最佳实践
五、小结
一、设计模式概念回顾
1.为什么引入设计模式?Why?
2.面向对象设计六大原则回顾
二、观察者模式概述
1.观察者模式定义:
又称为发布者/订阅者模式
“Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.”
“定义了对象间一种一对多依赖关系,使得每当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知,并被自动更新。”
2.观察者模式UML类图
3.观察者模式角色及使用场景
四大角色
1)抽象主题(Subject):
可用抽象类或接口来实现。
2)抽象观察者(Observer):
可抽象类或者接口来实现。
3)具体主题(ConcreteSubject):
当它的状态发生改变时,向它的各个观察者发出通知。
4)具体观察者(ConcreteObserver):
实现Observer的更新接口以使自身状态与主题的状态保持一致。
使用场景
1)关联行为(动态联动)场景。
2)事件多级触发场景。
3)跨系统的消息交换场景,如消息队列,事件总线的处理机制。
三、Android源码中观察者模式代码解析
1.Android源代码的观察者模式实现
AndroidFramework中相关源代码位置
☞/frameworks/base/core/java/android/database/Observable.java
☞/frameworks/base/core/java/android/database/DataSetObservable.java
☞/frameworks/base/core/java/android/database/DataSetObserver.java
AndroidFramework中观察者模式机制
1)DataSetObserver
抽象观察者(观察数据集:发生变化onChanged()、无效onInvalidated() )
2)Observable
抽象主题(添加、移除、注册、反注册)
3)DataSetObservable extendsObservable
具体主题(添加了通知数据改变和无效的两个方法)
2.Observable.java
3.DataSetObservable.java
4.DataSetObserver.java
5.ListView中观察者模式的使用—继承AdapterView,组合ListAdapter
6./frameworks/base/core/java/android/widget/AdapterView.java
7.ListView中观察者模式的使用—数据变化通知界面更新的流程
1)ListView继承自AdapterView(其中包含内部类AdapterDataSetObserver)
2)当ListView调用setAdapter(ListAdapteradapter)时,将生成观察者实例(ListView充当了观察者角色),并注册到mAdapter中(ListAdapter充当了被观察者角色)。
mDataSetObserver= new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
3)Adapter中数据变化时,将调用mAdapter.notifyDataSetChanged(),实际调用的是mDataObservable的notifyChanged(),其内部将执行每一个observer的onChanged(),也就达到了更新界面的效果。
四、观察者模式最佳实践
项目实践中典型的观察者模式框架:EventBus、RxJava、KVC/KVO(iOS)
五、小结
1.为什么引入设计模式?
使用设计模式有助于软件适应变化,增强可维护性、可复用性。
设计模式遵循的六大设计原则:SOLID+LawofDemeter。“高内聚、低耦合”
2.观察者模式主要作用就是解耦。
将观察者和被观察者进行隔离,只依赖于Observer和Observable抽象。
3.Android中的源代码,有助于我们理解观察者模式的编码实现方式,理解Listview界面更新的背后逻辑。
4.观察者模式最佳实践:EventBus、RxJava、KVC/KVO
Read more: