代码之家  ›  专栏  ›  技术社区  ›  Ran Biron

客户端Swing应用程序中的总线或侦听器/委托?

  •  2
  • Ran Biron  · 技术社区  · 17 年前

    构建客户端swing应用程序应该在总线上通知什么(应用程序范围的消息系统,在概念上类似于JMS,但更简单),以及应该使用直接侦听器通知什么?

    当我乘坐公共汽车时,我总是有一种无法逃避的感觉:“我不知道谁在哪里使用它。”。而且,没有设定的顺序,很难否决事件,很难确切知道在设定的时间发生了什么。

    另一方面,使用监听器意味着要么直接引用源对象(耦合),要么通过无数次转换传递引用(A--b_监听器-->b,b--c_监听器-->c只是因为A需要知道只有c才能知道的东西,但b对此不感兴趣)。

    所以,关于这一点有什么经验法则吗?有关于如何平衡的建议吗?

    4 回复  |  直到 17 年前
        1
  •  4
  •   davetron5000    17 年前

    我会选择最简单有效的方法;保持代码整洁,以“摇摆方式”执行,直到发现问题。

        2
  •  3
  •   Kevin Day    17 年前

    事件总线是在某些体系结构中提供解耦的非常非常有用的工具。监听器很容易实现,但当对象和依赖关系图变大时,监听器有很大的局限性。监听器往往会遇到循环依赖的问题(事件可能以奇怪的方式“反弹”,最终你不得不玩游戏以确保自己不会陷入困境。大多数绑定框架都会为你这样做,但知道监听器事件正在向上百万个地方飞去,会让人感到不快)。

    我根据项目规模和可伸缩性做出这种决定。如果它是一个大的应用程序,或者应用程序的某些方面可以通过动态(如插件模块等)来实现,那么总线是保持体系结构整洁的好方法(类似OSGI的模块容器是另一种方法,但重量更重)。

    Event Bus 项目-它与Swing配合得非常好,并为您提出的问题提供了一个健壮的开箱即用的解决方案。

        3
  •  2
  •   Steve McLeod    17 年前

    JavaSwing中的惯例是大量使用侦听器。坚持传统会提高可维护性,但会扼杀创新。

    我在Swing中没有遇到过总线方法,但我觉得它很有趣。

        4
  •  0
  •   Rastislav Komara    17 年前

    好的,我可以想象这样一种方法:使用类似总线的系统更新模型,使用监听器委派来自模型的事件。简单场景:我得到了代表数据生产者的服务器端。然后在客户端有一个got使用者接口,它使用所有传入的消息,并将它们转换为我的内部消息/DTO,然后将它们推送到总线,总线将它们分发到应用程序模型中。这些模型处理传入的消息,并决定使用侦听器通知感兴趣的组件。