如何实现Javascript中介(发布 - 订阅)模式

时间:2012-03-21 17:18:32

标签: javascript architecture

背景

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

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

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

  • 代码分为小模块
  • 模块只知道中介对象;模块无法直接与其他模块通信
  • 介体有一个简单的界面,用于发布和订阅消息
  • 模块可以订阅消息(通过中介API),提供回调函数
  • 模块可以使用参数对象将消息发布到中介,并且中介调用订阅该消息的任何模块的回调方法,并传递参数对象

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

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

假设我们有一个执行计算的辅助函数 - 假设它格式化一个字符串 - 并假设此函数应该可用于任何模块。此函数可以属于“工具”或“帮助程序”模块,然后可以重复使用并且可以测试。

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

问题(S)

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

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

2 个答案:

答案 0 :(得分:2)

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

https://github.com/jAndreas/BarFoos

答案 1 :(得分:0)

我认为调解员不是你想要的模式,至少不是你所描述的模式 想想2个对象同时触发 formatString 。每个人都会在 formatStringResult 中得到什么?

Mediator用于向正在收听的每个人播放活动。发布商不希望广播请求(例如 formatString )而非希望通知其他人有关他们的更改自己的国家。请注意信息的来源和使用者是如何不同的。拥有一个中介意味着那些方不必彼此有一个引用来进行交流,从而降低了它的耦合。