0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

好用的事件驱动工具:EventBus

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-25 14:59 次阅读

今天我们继续看看Guava,比较好用的事件驱动工具EventBus

Guava EventBus

EventBus是Guava的事件处理机制,是设计模式中观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus使用非常简单便捷。

图片

如果你做过CS的开发,下面这段代码可能会比较熟悉。

Button button = new Button("确定");

button.addListener( new Listener(){
    ...
    public void onClick(Event event){
        // 
    }
    ...
} );

为按钮注册事件监听,当按钮被点击时,则触发监听中相应的回调。在上面的代码中,有三个角色事件(Event),事件源(Button),监听(Listener),按钮作为事件源,当点击行为触发时,会将该行为封装成对应的点击事件,并根据行为类型将事件传递到响应的监听器上, 这也就是我们常说的监听器模式。

使用场景

  • 实现消息生产者与消费者间的解耦,对应事件源与监听器,而消息则是事件
  • 通过事件驱动业务流程扭转,通过异步执行机制实现代码非阻塞执行
  • 扩展主线外的分支业务,减少代码的侵入,比如各个环节的消息通知、短信提醒等
  • 实现消息广播到不同的模块中

示例

  • 订单支付时的消息发送
// 商品
public class ProductOrder {
    private String user; // 用户
    private String product; // 商品
    private double amount; // 金额
    @Override
    public String toString() {
        return String.format("用户:%s购买了商品:%s,总金额:%s", user, product, amount);
    }
}
// 事件
    @Data
    @AllArgsConstructor
    public static class CreateOrderEvent implements OrderEvent{
        private ProductOrder order;
    }
// 监听
    public static class CreateOrderListener{
        @Subscribe
        public void onEvent(CreateOrderEvent event) {
            log.info("创建订单:{}", event.getOrder());
        }
    }

测试: 我们可以定义各种事件,比如订单创建、订单取消、订单支付... 只需要简单的三个步骤即可:

// 1. 创建事件总线
    EventBus eventBus = new EventBus( ProductOrder.class.getName() );
// 2. 注册事件监听
    eventBus.register( new CreateOrderListener() );
    eventBus.register( new PayOrderListener() );
    eventBus.register( new CancelOrderListener() );
    eventBus.register( new RenewOrderListener() );
// 3. 发送事件通知
    eventBus.post(new ProductOrder.CreateOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.CancelOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.RenewOrderEvent(order));
    TimeUnit.SECONDS.sleep(1);
    eventBus.post(new ProductOrder.PayOrderEvent(order));
    TimeUnit.SECONDS.sleep(5);
    eventBus.post(new ProductOrder.ReturnOrderEvent(order));

同时我们可以通过AsyncEventBus建立事件异步总线,这样在事件被触发时,可以异步通知监听者完成事件回调,以此来提高响应速度。

核心

  • EventBus
    事件总线,可以理解为事件与监听器的上下文,主要实现事件的注册、事件的分发、以及监听器的回调,主要提供的方法包括:
    • register 注册监听,将监听器注册到事件总线,通过注解@Subscribe通知其监听的事件类型(第一个方法参数类型)
    • unregister 卸载监听,从事件总线移除监听
    • post 发送事件通知,根据post事件类型,找到所有订阅了该类型事件的监听器,并将事件推送到监听器对应的监听方法
  • Subscribe
    通过*@Subscribe*标识监听器所关注的事件类型
  • Event
    可以是任何对象,当然不建议将基础类型或String作为事件类型,这样就没法做到按类型区分了

图片

通过上面的图就可以很清楚各个各个组件的职责,以及如何通过事件总线完成事件向监听的传播,最终基于事件回调机制完成消息传递。基于事件驱动的服务模型

上面这种结构的图形是不是在很多位置都见过,这是一种经典的设计模式。试想一下,我们不通过事件驱动行为时,一般你们怎么写代码,通过ifelse?或者其他有着异曲同工的 实现方法,目的最后都是一样。基于Guava提供的工具,我们不仅在使用时只需要简单的三个步骤就能实现,同样,当需要屏蔽该功能时只需要去掉register一行即可,对整体功能 也没有任何的影响。

在我们引入某种设计模式,某种架构模型时,总的目的都是为了降低代码模块间的耦合度,提升代码整体的可读性,最终让代码能够易于维护性,或者有一定的复用性。

总结

事件监听模式、观察者模式、发布订阅模式,都是非常的相似,通过建立事件与监听器、观察者与被观察者、生产者与消费者者间消息传递媒介(示例中的事件总线EventBus),

不仅能够使消息的发起者与接收者之间进行解耦,最主要的是通过消息传递渠道实现消息异步传播,提升系统效率

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2485

    浏览量

    46539
  • 总线
    +关注

    关注

    10

    文章

    2706

    浏览量

    87222
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66800
  • 工具
    +关注

    关注

    3

    文章

    306

    浏览量

    27436
收藏 人收藏

    评论

    相关推荐

    选购电动工具注意事项

    动工具是一种由电动机或电磁铁为动力,通过传动机构驱动工作头进行作业的手持式或可移式的机械化工具
    发表于 11-29 00:01 754次阅读

    动工具中七种高边驱动方案分析

    、20V、24V、40V、60V和80V,会使用机械开关控制驱动板供电,但是由于机械开关的特性,会存在开关火花、寿命、体积等缺点。 图1:电动工具中机械开关应用 在电动工具中,引入高边
    发表于 11-10 09:07 7596次阅读
    电<b class='flag-5'>动工具</b>中七种高边<b class='flag-5'>驱动</b>方案分析

    基于电源模块的电动工具设计

    动工具、 园艺工具和吸尘器等家电使用低电压(2至10节)锂离子电池供电的电机驱动。这些工具使用有刷直流(BDC)或三相无刷直流(BLDC)电机。BLDC电机效率更高、维护少、噪音小、
    发表于 07-22 08:10

    动工具直流驱动方案

    `功能特点:◆ 可应用于农业机械、电动工具等产品。◆ 支持输入电压12V~24V,可用12V、18V锂电池电池输入,电池电能耗尽自动保护。支持稳定输出电流20A,瞬时电流60A。◆ 可以外接操作信号
    发表于 06-22 16:44

    动工具中高边驱动方案

    在无绳电动工具应用中,电池包的电压通常为16V、20V、24V、40V、60V和80V,会使用机械开关控制驱动板供电,但是由于机械开关的特性,会存在开关火花、寿命、体积等缺点。图1:电动工具中机械
    发表于 11-04 07:45

    电机驱动在无线电动工具中的应用

    无线电动工具应用中电机控制设计的考量
    的头像 发表于 08-22 00:11 3706次阅读

    CH341SER驱动USB转串口驱动工具软件免费下载

    本文档的主要内容详细介绍的是CH341SER驱动USB转串口驱动工具免费下载
    发表于 04-24 08:00 10次下载
    CH341SER<b class='flag-5'>驱动</b>USB转串口<b class='flag-5'>驱动工具</b>软件免费下载

    有刷电动工具和无刷电动工具的区别

    转速;无刷电动工具高于有刷电动工具。而且采用数字变频控制,可控性好。有刷电动工具运转速度低于无刷电动工具,启动后速度恒定调速不容易。
    发表于 06-25 18:40 1.9w次阅读

    如何解决电动工具散热问题

    动工具是一种由电动机或电磁力作为动力,通过传动结构驱动工作头进行作业的手持式或可移式的机械化工具,具有结构轻巧,携带方便的优点,广泛应用于国民经济各个领域及日常家庭中。与此同时,电动工具
    发表于 09-02 14:58 1416次阅读

    红外摄像头驱动工具ThermoX软件下载

    红外摄像头驱动工具ThermoX软件下载
    发表于 09-05 17:15 58次下载

    动工具中高边驱动方案分析

    动工具中高边驱动方案分析
    发表于 10-28 12:00 3次下载
    电<b class='flag-5'>动工具</b>中高边<b class='flag-5'>驱动</b>方案分析

    AN6411_基于MM32F0144无感方波BLDC电动工具驱动篇应用笔记(中文版)

    AN6411_基于MM32F0144无感方波BLDC电动工具驱动篇应用笔记(中文版)
    发表于 02-22 18:48 0次下载
    AN6411_基于MM32F0144无感方波BLDC电<b class='flag-5'>动工具</b><b class='flag-5'>驱动</b>篇应用笔记(中文版)

    无刷三相直流电机电动工具驱动方案设计

    动工具是一种工具,其致动通过附加的动力源和机构比仅其他手工劳动与使用手工工具,电动工具用于工业、建筑、花园、做饭、清洁等家务劳动,以及在房子周围用于
    发表于 03-08 14:51 7次下载
    无刷三相直流电机电<b class='flag-5'>动工具</b><b class='flag-5'>驱动</b>方案设计

    Linearin ▏先积产品在电动工具的应用

    先积产品在电动工具领域的应用电动工具省时省力的优势,非常受大众欢迎,无论是专门安装的产线,还是喜欢在家里DIY的爱好者,均不约而同的选择了电动工具来代替手动工具。同时很多品牌也新推出了
    的头像 发表于 10-09 10:12 936次阅读
    Linearin ▏先积产品在电<b class='flag-5'>动工具</b>的应用

    动工具想升级?快充必须要跟上

    驱动的电动工具却扩大了作业范围,并且通过去除电缆大幅降低了触电风险,提升了工作安全性。因此,无绳电动工具在市场中的销售份额正在逐步提升,走向无绳化、锂电化已经成为了行业发展的大势所趋。 尽管如此,无绳电
    的头像 发表于 06-26 15:10 615次阅读
    电<b class='flag-5'>动工具</b>想升级?快充必须要跟上