大家好,我是北军。今天我们继续看Guava,一个比较好用的事件驱动工具EventBusGuavaEventBusEventBus是Guava的事件处理机制,是设计模式中观察者模式(生产/消费者编程模型)的一种优雅实现。对于事件监听和发布订阅模式,EventBus使用起来非常简单方便。如果你做过CS开发,可能对下面的代码很熟悉。按钮button=newButton("确定");button.addListener(newListener(){...publicvoidonClick(Eventevent){//}...});为按钮注册事件监听器,当按钮被点击时,在监听器中触发相应的回调。上面代码中,一共有三个角色事件(Event)、事件源(Button)、监听器(Listener),按钮作为事件源,当点击行为被触发时,该行为会被封装成对应的点击事件,以及根据行为类型将事件传递给相应的监听器,也就是我们常说的监听器模式。场景用于实现消息生产者和消费者的解耦,对应事件源和监听器,而消息是由事件驱动的事件来逆向业务流程,通过异步执行机制实现代码非阻塞执行扩展分支服务主线外,减少代码侵入,如各个链接消息通知,短信提醒等,实现消息广播到不同模块订单支付时发送消息示例//commoditypublicclassProductOrder{privateStringuser;//用户私有字符串产品;//商品私有双倍数量;//Amount@OverridepublicStringtoString(){returnString.format("用户:%s购买的商品:%s,总金额:%s",user,product,amount);}}//事件@Data@AllArgsConstructorpublicstaticclassCreateOrderEventimplementsOrderEvent{privateProductOrderorder;}//listenpublicstaticclassCreateOrderListener{@SubscribepublicvoidonEvent(CreateOrderEventevent){log.info("创建订单:{}Order",event.get());}}测试:我们可以定义各种事件,比如订单创建、订单取消、订单支付……只需三个简单的步骤://1.创建一个事件总线EventBuseventBus=newEventBus(ProductOrder.class.getName());//2.注册事件监听器eventBus.register(newCreateOrderListener());eventBus.register(newPayOrderListener());事件总线.register(newCancelOrderListener());eventBus.register(newRenewOrderListener());//3.发送事件通知eventBus.post(newProductOrder.CreateOrderEvent(order));TimeUnit.SECONDS.sleep(1);eventBus.post(newProductOrder.CancelOrderEvent(order));TimeUnit.SECONDS.sleep(1);eventBus.post(新的ProductOrder.RenewOrderEvent(订单));TimeUnit.SECONDS.sleep(1);eventBus.post(newProductOrder.PayOrderEvent(order));TimeUnit.SECONDS.sleep(5);eventBus.post(新的ProductOrder.ReturnOrderEvent(订单));同时,我们可以通过AsyncEventBus建立一个事件异步总线,这样当事件触发时,可以异步通知监听器完成事件回调,以提高响应速度。核心EventBus事件总线可以理解为事件和监听器的上下文。主要实现事件注册、事件分发、监听回调。提供的主要方法包括:register注册监听,以及监听器注册到事件总线,通过注解@Subscribe通知它监听的事件类型(第一个方法参数类型)。Unregister卸载侦听器,从事件总线中删除侦听器发布,并发送事件通知。typeeventlistener,将事件推送给监听器对应的监听方法。Subscribe使用@Subscribe来标识监听器关注的事件类型。事件可以是任何对象。当然,不推荐使用基本类型或者String作为事件类型,这样就没有方法可以通过类型来区分了。通过上图,可以清楚的了解到各个组件的职责,以及如何通过事件总线完成事件向监视器的传播,最终基于事件回调机制完成消息传递。基于事件驱动的服务模型,上面的结构你在很多地方见过吗?这是一个经典的设计模式。试想一下,当我们不通过事件来驱动行为的时候,你一般是怎么通过ifelse来写代码的呢?或者其他方法类似但同样令人满意的实现方法,最终目的是一样的。基于Guava提供的工具,我们不仅在使用的时候只需要简单的三步就可以实现,而且在需要屏蔽这个功能的时候,我们只需要删除register这一行,对整体功能。当我们引入某种设计模式或某种架构模型时,总体目的是降低代码模块之间的耦合度,提高代码的整体可读性,最终使代码易于维护或具有一定的复用性。综上所述,事件监听模式、观察者模式、发布订阅模式都非常相似。通过在事件与监听者、观察者与被观察者、生产者与消费者之间建立消息传递媒介(本例中的事件总线EventBus),不仅可以解耦消息的发起者与接收者,还可以实现消息的异步传播通过消息传递通道,提高系统效率
