android 中观察者模式,谈谈Android中的观察者模式

3abad71503971437c3e4929b6290e204.gif

1d4c305833356fbabbd5ea9b59871f44.png

谈谈Android中的观察者模式

App研发组 匡仁锦

一、设计模式概念回顾

二、观察者模式概述

三、Android源码中观察者模式代码

四、观察者模式最佳实践

五、小结

一、设计模式概念回顾

1.为什么引入设计模式?Why?

32f28efc1c4fd0d44b377de6932af988.png

2.面向对象设计六大原则回顾

e55a2accff1748c9178dcdcb4a43b669.png

二、观察者模式概述

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类图

796f8a35b1638f924c33c32781fd342e.png3.观察者模式角色及使用场景

四大角色

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

4c541bbc2f0df808fe639355cee0c9f7.png3.DataSetObservable.java

10f2fb7742441fea5f8b272d1fdd5e96.png4.DataSetObserver.java

deff83f1dc4dfabdc397852d5cd94fb4.png

5.ListView中观察者模式的使用—继承AdapterView,组合ListAdapter

a8e8460dcc77934c99790789dc98986a.png

6./frameworks/base/core/java/android/widget/AdapterView.java

207905e4fbaa16b632f07a425042c9fb.png7.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)

40354619c9019c3ade53c506dd1a94bd.png五、小结

1.为什么引入设计模式?

使用设计模式有助于软件适应变化,增强可维护性、可复用性。

设计模式遵循的六大设计原则:SOLID+LawofDemeter。“高内聚、低耦合”

2.观察者模式主要作用就是解耦。

将观察者和被观察者进行隔离,只依赖于Observer和Observable抽象。

3.Android中的源代码,有助于我们理解观察者模式的编码实现方式,理解Listview界面更新的背后逻辑。

4.观察者模式最佳实践:EventBus、RxJava、KVC/KVO

dacccd51929a695c99145a1ad32c2243.png

Read more:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值