type
status
date
slug
summary
tags
category
icon
password
💡
观察者模式在Android开发中应该是最常用的设计模式了,点击事件、网络回调、事件触发回调、广播都是观察者模式。 定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer

使用场景

一个对象发生改变时,通知其他对象改变

优缺点

优点:
  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系
  • 目标与观察者之间建立了一套触发机制
缺点:
  • 目标与观察者之间的依赖关系并没有完全解除
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化

结构

观察者:对某个事件进行观察,当收到通知后,执行对应逻辑。
被观察者:负责维护所有的观察者对象,可以发布消息来通知观察者事件已经发生。
事件:观察者关系哪个事件,其实本质上就是观察者关心哪个对象的变化,观察者收到事件信息会做相应的处理。

模板代码

使用实例EvenetBus

EventBus就是通过数据总线向注册envetbus的context发消息,其实就是一种广播,这里不去分析源码,我们简单实现一个eventbus帮助我么更好理解观察者模式,之前面试是时候也遇到过手写eventbus,eventbus实现简单,还是值得掌握的。
EventBus有以下几个角色:
  1. @Subscribe注解:标注了该注解的方法,作为一个观察者。
  1. ObserverAction:保存一个观察者的源数据信息,包括观察者对象本身,和标注了@Subscribe注解的method对象。
  1. ObserverRegistry:保存了事件类型对所有ObserverAction的映射。
  1. EventBus:消息总线,保存了ObserverRegistry对象作为成员变量。
  1. AsyncEventBus:继承了EventBus,使用异步方式进行通知。
@Subscribe注解

保存观察者源信息的类ObserverAction

ObserverRegistry内部使用ConcurrentHashMap和CopyOnWriteArraySet保存了包装了观察者方法的ObserverAction对象信息。

EventBus消息总线类,内部成员变量保存了ObserverRegistry。

单元测试
首先创建事件类,这里模拟的是下单事件,假设下单之后,要增加积分和进行发货,使用IntegralObserver和DeliveryObserver两个观察者来处理积分增加和发货逻辑。
增加积分观察者和发货观察者
测试发布订阅
总结一下:EventBus把注册的对象中带有注解的方法都提取出来,根据eventType存放到列表中,在post的时候根据eventType找到对应的方法并执行。

📎 参考

代理模式(Retrofit)工厂模式
LuluNotion
LuluNotion
一个普通的干饭人🍚
公告
type
status
date
slug
summary
tags
category
icon
password
🎉NotionNext 4.0即将到来🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏