zoukankan      html  css  js  c++  java
  • 事件总线模式实例

    事件总线定义:事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。

    事件总线的处理流程:

    Event Bus就相当于一个介于Publisher和Subscriber中间的桥梁。它隔离了Publlisher和Subscriber之间的直接依赖,接管了所有事件的发布和订阅逻辑,并负责事件的中转。分析一下,如果EventBus要接管所有事件的发布和订阅,那它则需要有一个容器来记录事件源和事件处理。那又如何触发呢?有了事件源,我们就自然能找到绑定的事件处理逻辑,通过反射触发

    EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式

     

    1.事件总线维护一个事件源与事件处理的映射字典;

    2.通过单例模式,确保事件总线的唯一入口;

    3.利用反射完成事件源与事件处理的初始化绑定;

    4.提供统一的事件注册、取消注册和触发接口。

    事件总线EventBus的设计

      为什么要设计EventBus,因为他是领域驱动设计中比不可少的模块,它承担传输数据的作用,它可以解耦模块之间的耦合性。

      如何对EventsBus进行定义。1、EventBus是基于JVM内部的数据传输系统,不是JMS;EventBus的核心对象为Event和EventHandler。

      

      EventBus的模块结构如下:

      EventService对外提供各种服务,它依赖queue,bus,annotatin。

      queue包为EventService提供事件源。

      bus包提供两种事件总线:ClassEventBus和TopicEventBus。

      annotatin包提供两种注解方式@ClassEventHandler和@TopicEventHandler。

      queue包结构如下:

      QueueWrapper是对各种Event的包装,使他们能够统一放入Queue。

      EventQueue本质上阻塞队列,负责接收事件和提取事件。

      

      Bus包结构如下:

      EventBus是Facade类,统筹ClassEventBus和TopicEventBus,ClassEventBus和TopicEventBus在处理订阅着、分发事件是相似的,区别在Class是针对事件的类型,而TopicEventBus针对的主题。以ClassEventBus的为例,结构如下:

      Key2List是 是对 Map<key,List<Value>> 中List<Value>的封装,统一各种常用的操作,EventType2Event是个事件类型对应的事件列表,用于缓存控制。Class2Handler保存事件的订阅者,ClassEventBus每发布一次事件,都会Class2Handler中取得订阅者。

      notifyHandlers(Event)是Bus一个关键设计点。如果是采用一个线程循环处理所有事件的方式,在处理复杂计算的事情时,会影响其他订阅者。如果是采用每个线程对应一个订阅者,则在高并发的情况下,线程会增加,系统资源占用率提高。如果是采用Executor来应对,则是折中的办法。

      订阅者想处理ClassEvent,必须实现ClassEventHandler。

      annotation包是以注解的方式来调用bus包下各种EventBus。如果想让业务Facade类,监听某个事件,则给方法加上@ClassEventHandler或@TopicEventHandler。然后让AnnotationProcessor调用process即可。以ClassEventHandler对应的模块为例,来介绍其结构:

      AnnotationProcessor的process处理过程如下:
          1、从object对象,找出带有ClassEventHanlder的函数。
          2、把方法和Object,整合到ProxClassHandler。
          3、ProxyClassHanlder注册到EventService中。

      ProxyClassHandler最重要的边上onEvent(Evenet),它的功能是以反射的方式调用指定方法。

      最后是介绍EventService,它的结构很简单:

      其中,最关键的时RunTask,他继承Runnable类,在run()中,线程不停地从eventQueue获取事件,然后发布给订阅者。当然RunTask在EventService初始化的时候,就会生成,知道EventService销毁。

      最终的类图

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/dk1203573488/p/9099024.html
Copyright © 2011-2022 走看看