上一篇 EventBus設(shè)計模式剖析(三)觀察者模式
EventBus:
由開源組織greenrobot開發(fā)的事件發(fā)布-訂閱總線庫冒黑。
設(shè)計模式:
軟件開發(fā)中問題的解決套路。
中介者模式簡介
定義:中介者模式(Mediaor Pattern)包裝了一些列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使它們可以松散耦合笑诅。
中介者模式是用來解決緊耦合問題,該模式將對象之間“多”對“多”的關(guān)系轉(zhuǎn)變成“多”對“一”對“多”的關(guān)系,其中“一”就是中介者砌梆。中介者對象將系統(tǒng)從網(wǎng)狀結(jié)構(gòu)變成了以中介者為中心的星形結(jié)構(gòu)。
若源碼中含有Mediaor 這個詞,大概率用了中介者模式芦鳍。
EventBus就是一個中介者
上圖是EventBus官網(wǎng)給出的框架示意圖籍琳,很明顯可以看出EventBus作為Publisher(發(fā)布者)和Subscriber(訂閱者)之間的中介者喝峦,用于傳輸Event查近。事實上勋锤,EventBus作為事件總線類,角色更應(yīng)該如下圖所示:
圖中,Class<>表示事件類琼牧,Event表示時間撬槽,EventBus表示時間總線,Subscription表示訂閱者趾撵,onEvent()表示訂閱者接收到事件后的回調(diào)侄柔。
而如果沒有事件總線,發(fā)布者和訂閱者之間的關(guān)系就可能像下圖一樣紛亂:
最后上源碼:
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關(guān)聯(lián)在一起薪者,EventBus記錄這一信息纵苛,以和事佬的身份,協(xié)調(diào)發(fā)布者和訂閱者之間的通訊啸胧。
基于中介者模式構(gòu)建的其他代碼
1赶站、Android源碼中的KeyguardViewMediator類。
2纺念、MVC 框架,其中C(控制器)就是 M(模型)和 V(視圖)的中介者想括。比如陷谱,ListView的Adapter就是中介者。
參考文獻
1瑟蜈、設(shè)計模式|菜鳥教程:https://www.runoob.com/design-pattern/design-pattern-tutorial.html
2烟逊、《Android源碼設(shè)計模式解析與實戰(zhàn)》何紅輝,關(guān)愛民著
3铺根、蕉下孤客:http://www.reibang.com/p/1b68ace4600a
4宪躯、野生的安卓獸:http://www.reibang.com/nb/10598547