EventBus设计模式剖析(四)中介者模式

2019-07-17  本文已影响0人  YongtaoHuang

上一篇 EventBus设计模式剖析(三)观察者模式

EventBus:

由开源组织greenrobot开发的事件发布-订阅总线库。

设计模式:

软件开发中问题的解决套路。

中介者模式简介

定义:中介者模式(Mediaor Pattern)包装了一些列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。

中介者模式是用来解决紧耦合问题,该模式将对象之间“多”对“多”的关系转变成“多”对“一”对“多”的关系,其中“一”就是中介者。中介者对象将系统从网状结构变成了以中介者为中心的星形结构。
若源码中含有Mediaor 这个词,大概率用了中介者模式。

EventBus就是一个中介者

EventBus-Publish-Subscribe.png

上图是EventBus官网给出的框架示意图,很明显可以看出EventBus作为Publisher(发布者)和Subscriber(订阅者)之间的中介者,用于传输Event。事实上,EventBus作为事件总线类,角色更应该如下图所示:


有EventBus.png

图中,Class<>表示事件类,Event表示时间,EventBus表示时间总线,Subscription表示订阅者,onEvent()表示订阅者接收到事件后的回调。
而如果没有事件总线,发布者和订阅者之间的关系就可能像下图一样纷乱:


没有EventBus.png

最后上源码:

private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
private final Map<Object, List<Class<?>>> typesBySubscriber;

EventBus(EventBusBuilder builder) {
    //一个HashMap,以事件类型eventType为key,以存储了订阅者subscriber和订阅方法subscriberMethod的集合CopyOnWriteArrayList<Subscription>为value
    subscriptionsByEventType = new HashMap<Class<?>, CopyOnWriteArrayList<Subscription>>(); 
    //一个HashMap,以订阅者subscriber为key,以订阅者所订阅的事件类型eventType的集合List<Class<?>>为value
    typesBySubscriber = new HashMap<Object, List<Class<?>>>();
}

我们自行定义的事件类和Subscription类通过者两个HashMap关联在一起,EventBus记录这一信息,以和事佬的身份,协调发布者和订阅者之间的通讯。

基于中介者模式构建的其他代码

1、Android源码中的KeyguardViewMediator类。
2、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。比如,ListView的Adapter就是中介者。

参考文献

1、设计模式|菜鸟教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
2、《Android源码设计模式解析与实战》何红辉,关爱民著
3、蕉下孤客:https://www.jianshu.com/p/1b68ace4600a
4、野生的安卓兽:https://www.jianshu.com/nb/10598547

上一篇 EventBus设计模式剖析(三)观察者模式

All is well.

上一篇 下一篇

猜你喜欢

热点阅读