【问题标题】:How to implement the Javascript mediator (publish-subscribe) pattern如何实现 Javascript 中介(发布-订阅)模式
【发布时间】:2012-04-06 06:24:15
【问题描述】:

背景

我们有一个相当复杂的 Silverlight 客户端,我们正在用 HTML/Javascript/CSS 重写它,构建在相同的 Web 服务之上。实际上,我们正在移植两个 Silverlight 不同的客户端,它们共享一些共同的功能。

我阅读了http://addyosmani.com/largescalejavascript/ 上的文章,并计划使用建议的架构,尤其是中介者模式。

Addy 描述的模式的 10000 英尺概览:

  • 代码分为小模块
  • 模块只知道中介对象;模块不能直接与其他模块通信
  • 中介具有用于发布和订阅消息的简单界面
  • 模块可以订阅消息(通过中介 API),提供回调函数
  • 模块可以向中介者发布消息,带有参数对象,中介者调用任何订阅消息的模块的回调方法,传递参数对象

这里的主要目标之一是实现模块之间的松散耦合。所以我们可以重用两个客户端中的模块。并单独测试模块。中介者应该是我们唯一需要的全局对象,它必须是好的。

虽然我喜欢这个想法,但我觉得在某些情况下它过于复杂,而且我的一些团队成员不会被说服。让我举例说明:

假设我们有一个辅助函数来执行计算——假设它格式化一个字符串——并假设这个函数应该可用于任何模块。该函数可能属于“工具”或“帮助”模块,然后可重用和测试。

要从任意模块调用此函数,我必须发布一条消息,例如 formatString 以我的输入字符串作为参数。并且帮助函数订阅了 formatString 消息。但在我发布 formatString 消息之前,我首先必须使用回调函数订阅像 formatStringResult 这样的消息可以接收结果。然后,一旦我得到结果,我就取消订阅 formatStringResult 消息。

问题

  • 中介是否应该直接在其自己的界面中提供此类帮助程序功能?
  • 或者我应该扩展发布接口以允许可选的结果参数,帮助方法可以直接写入结果?
  • 具有额外中介层的折衷方案真的值得吗? 实现松耦合的好处?

非常感谢具有在“复杂”JavaScript 应用程序中实现松耦合经验的开发人员的建议。

【问题讨论】:

    标签: javascript architecture


    【解决方案1】:

    您实际上完美地描述了BarFoos application Framework

    https://github.com/jAndreas/BarFoos

    【讨论】:

      【解决方案2】:

      我认为调解器不是您正在寻找的模式,至少不是您所描述的。
      想想 2 个对象同时触发 formatString。每个人会在他们的 formatStringResult 中得到什么?

      Mediator 用于向所有正在收听的人广播事件。发布者不想广播请求(例如formatString),而是希望通知其他人他们的自己的状态。注意信息的来源和消费者是如何不同的。拥有调解器意味着这些各方不必相互引用即可进行通信,从而降低了耦合度。

      【讨论】:

      • 感谢您的回答 - 关于您关于两个对象同时触发 'formatString' 的观点,请稍作说明:这里不涉及多线程;向中介者发布消息本身并不是异步的,它会调用所有订阅者然后返回。
      • 同意,我错过了我们在浏览器环境中的事实:) 其余部分仍然有效:如果发布者不关心事件的结果,则使用调解器通知其他对象.
      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      相关资源
      最近更新 更多