【问题标题】:How do I use the mediator pattern with multiple instances of a mediator in Javascript?如何在 Javascript 中将中介者模式与中介者的多个实例一起使用?
【发布时间】:2014-09-17 16:32:36
【问题描述】:

据我了解,使用中介者模式看起来像:

  • 仅模块发布,但不订阅。中介者订阅事件并让其他模块根据这些事件执行操作。

例如,假设我们有一个 javascript 编辑器。假设有一个编辑器(用于代码)和一个运行选项卡(您可以在其中单击运行并查看代码的输出)。每一个都是它自己的模块。当用户点击运行时,运行选项卡模块会输出一个类似“runButtonClicked”的事件,中介订阅该事件并在该事件触发时运行代码。这个例子有点做作和简化,但希望这能让我对我想要实现的目标有所了解。

假设您有一些“类”Mediator,每个模块都通过 Pub/Sub 与之通信。

如果我正确理解了这种模式,那么这一切都是有道理的。但是,当您希望在页面上拥有此核心“应用程序”的多个实例时,似乎出现了一个问题——应用程序如何知道要响应哪些事件以及哪些事件应该留给页面上的其他实例?

似乎我想要多个中介,但我不确定这些将如何传递到对象中。

var mediator = new Mediator();
var moduleOne = new moduleOne(mediator);
var moduleTwo = new moduleTwo(mediator);

这种方法似乎有问题,因为我想访问调解器内部的这两个模块。

我还听说过与中介一起使用的沙盒/外观模式,但我不确定其中任何一个是否会有所帮助(也就是说,我不太了解它们)。

更新 我刚刚找到Mediator pattern and creation,这似乎是一个可能的解决方案。但我也想知道我是否正确地使用和思考这些模式。

【问题讨论】:

  • “中介者订阅事件并让其他模块根据这些事件做事” - 你能举个例子吗?它可能有助于验证您的模式选择。
  • 只更新一个例子。这有帮助吗?这个例子中的想法可能是我们希望页面上有多个这个编辑器的实例。我们如何使用消息传递系统处理这个问题?

标签: javascript design-patterns mediator facade


【解决方案1】:

应用程序的每个实例都需要自己的事件空间(或通道),因此它的事件不会污染其他实例。如果应用程序实例需要相互通信,那么这可能需要更多的事件空间。根据您使用的事件库,有几种方法可以做到这一点:

  1. jQuery 事件支持命名空间,因此如果每个应用程序实例都有一个唯一的名称,您可以使用应用程序名称作为命名空间来隔离事件。
  2. EventEmitter 库支持创建多个 EventEmitter 实例,这与由 jQuery 单例管理事件的 jQuery 不同。在这种情况下,您可以将其自己的 EventEmitter 实例附加到每个应用程序。

  3. 如果您的库没有创​​建事件空间的良好机制,您也可以使用调解器模式自行开发。在这种情况下,您可以为每个命名空间创建一个中介。

中介者模式可以与选项 1 和 2 结合使用,上面的列表绝不是详尽的。

这种方法似乎有问题,因为我想访问调解器内部的这两个模块。

为了将调解器与其管理的模块连接起来,我认为您需要一个单独的方法来做到这一点。也许像

var mediator = new Mediator();
var moduleOne = new moduleOne;
var moduleTwo = new moduleTwo;
moduleOne.mediator = mediator;
mediator.register(moduleOne);
moduleTwo.mediator = mediator;
mediator.register(moduleTwo);

【讨论】:

  • 谢谢!那么我是否正确使用了这种模式?还有其他模式可以帮助解决这种情况吗?
  • 还有一个问题:中介是否应该处理设置事件处理程序(例如点击时)。还是应该在模块中处理?
  • @JoshuaKravitz,当我第一次学习设计模式时,我问 IDE 中是否有一些东西可以为我生成代码模板。那是使用模式的错误方法,因为模式不是食谱。我建议您将 MP 视为代码责任分工的原则。您使用 MP 将管理事件的责任从模块转移到调解器。您可以选择要卸载多少责任。
  • 谢谢!这实际上非常有帮助。我在网上看到的都是模糊的小例子,很难应用,但我想这是因为原则比确切的实现更重要。再次感谢。
猜你喜欢
  • 2014-10-14
  • 1970-01-01
  • 2014-04-20
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多