姬長信(Redy)

java – 为什么人们在代码中使用消息/事件…


我认为您已经听说过消息/事件总线,它是系统中所有事件流动的单一位置.在计算机的主板和LAN网络中可以找到类似的架构.这对于主板和网络来说是一个很好的方法,因为它减少了电线的数量,但它对软件开发有好处吗?我们没有像电子产品那样的限制.

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

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

发布事件是通过bus.fireEvent(事件)完成的,接收消息由bus.addListener(侦听器)启用.这种体系结构有时用于软件开发,例如MVP4G为GWT实现类似的消息总线.

活跃项目:

>谷歌Guava EventBus
> MBassador by Benjamin Diedrichsen
> Mycila PubSub by Mathieu Carbou
> mvp4g Event Bus
> Simple Java Event Bus

休眠/死亡项目:

> Sun / Oracle JavaBeans InfoBus
> https://eventbus.dev.java.net/ [链接断开]

它只是流行的Observer(Listener)模式“全局” – 系统中的每个对象都可以监听每条消息,我认为这很糟糕,它打破了封装原则(每个对象都知道所有内容)和单一责任原则(例如,某些对象需要一种新类型的消息,事件总线通常需要更改,例如在Listener类中添加一个新的Listener类或一个新方法.

由于这些原因,我认为,对于大多数软件来说,Observer模式比事件总线更好.您如何看待事件总线,它对典型应用程序有什么好处?

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