EventBus设计模式剖析(四)中介者模式
上一篇 EventBus设计模式剖析(三)观察者模式
EventBus:
由开源组织greenrobot开发的事件发布-订阅总线库。
设计模式:
软件开发中问题的解决套路。
中介者模式简介
定义:中介者模式(Mediaor Pattern)包装了一些列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。
中介者模式是用来解决紧耦合问题,该模式将对象之间“多”对“多”的关系转变成“多”对“一”对“多”的关系,其中“一”就是中介者。中介者对象将系统从网状结构变成了以中介者为中心的星形结构。
若源码中含有Mediaor 这个词,大概率用了中介者模式。
EventBus就是一个中介者

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

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

最后上源码:
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