java - 为什么人们在他们的代码中使用消息/事件总线?

标签 java events design-patterns event-handling

关闭。这个问题是opinion-based .它目前不接受答案。




2年前关闭。










锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。








我想你听说过消息/事件总线,它是系统中所有事件流动的唯一地方。在计算机的主板和 LAN 网络中可以找到类似的架构。这是主板和网络的好方法,因为它减少了电线的数量,但它对软件开发有好处吗?我们没有电子产品那样的限制。

消息总线/事件总线的最简单实现可以是这样的:

class EventBus {
    void addListener(EventBusListener l}{...}
    void fireEvent(Event e) {...}
}

发布事件由 bus.fireEvent(event) 完成,接收消息由 bus.addListener(listener) 启用。这种架构有时用于软件开发,例如 MVP4G 为 GWT 实现了类似的消息总线。

活跃项目:
  • 谷歌 Guava EventBus
  • MBassador来自 Benjamin Diedrichsen
  • Mycila PubSub来自 Mathieu Carbou
  • mvp4g Event Bus
  • Simple Java Event Bus

  • hibernate/死亡项目:
  • Sun/Oracle JavaBeans InfoBus
  • https://eventbus.dev.java.net/ 【链接失效】

  • 这只是流行的“全局”观察者(监听器)模式——系统中的每个对象都可以监听每条消息,我认为这很糟糕,它打破了封装原则(每个对象都知道一切)和单一职责原则(例如,当某些对象需要一种新的消息类型,通常需要更改事件总线,例如添加新的 Listener 类或 Listener 类中的新方法)。

    由于这些原因,我认为对于大多数软件来说,观察者模式比事件总线更好。您如何看待事件总线,它对典型应用程序是否有意义?

    编辑:我不是在谈论像 ESB 这样的“大”企业解决方案——它们可能很有用(而且 ESB 提供的不仅仅是一个事件总线)。我问的是在“常规”Java 代码中使用消息总线进行对象到对象连接的有用性 - 有些人这样做,请查看上面的链接。事件总线可能是电话到电话通信或计算机到计算机通信的最佳解决方案,因为网络中的每个电话(或计算机)通常可以相互通信,而总线减少了电线的数量。但是对象很少互相交谈——一个对象可以有多少个合作者——3、5?

    最佳答案

    有些人喜欢它,因为它是Facade pattern的体现。或 Mediator pattern .它集中了跨领域 Activity ,如日志记录、警报、监控、安全等。

    有些人不喜欢它,因为它通常是单例故障点。每个人都必须了解它。

    关于java - 为什么人们在他们的代码中使用消息/事件总线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3987391/

    相关文章:

    design-patterns - 从用例到类图 - 我该怎么做?

    java - jdbc何时填写为executeBatch()编写的准备语句的 '?'

    java - 无法在网络浏览器中运行小程序程序,但在小程序查看器中运行正常?

    java - 如何让 myfirstapp 在 android studio 上运行?

    java - 如何创建正则表达式来替换已知字符串,同时保持可选参数不变?

    javascript/mootools |自定义事件

    c++ - 如何只允许对像对象这样的整数有效值并对其进行迭代?

    javascript - JS : Variable scopes and event-loop

    javascript - addEventListener 不适用于 onbeforeunload

    c++ - MFC中的MVC模型