• 事件总线模式实例


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

    事件总线的处理流程:

    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销毁。

      最终的类图

  • 相关阅读:
    IO基础
    集合框架
    数据结构基础
    进程和线程
    matlab绘制三维图形
    matlab figure 窗口最大化
    Matlab中的fread函数
    matlab中fopen 和 fprintf函数总结
    matlab中findstr,strfind,strcmp,strncmp区别与联系
    matlab取消和添加注释以及一些快捷键
  • 原文地址:https://www.cnblogs.com/dk1203573488/p/9099024.html
Copyright © 2020-2023  润新知