如何在Javascript中将介体模式与多个中介实例一起使用?

时间:2014-07-25 18:23:54

标签: javascript design-patterns mediator facade

据我所知,使用中介模式看起来像:

  • 模块仅发布,但不要订阅。中介者订阅事件并使其他模块根据这些事件做事。

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

所以,让我们说你有一些"类",Mediator,每个模块通过Pub / Sub进行通信。

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

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

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

这个方法似乎有问题,因为我想访问中介中的那两个模块

我也听说过与调解员一起使用的沙盒/立面图案,但我不确定其中任何一种是否会有所帮助(也就是说,我不太了解它们)。

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

1 个答案:

答案 0 :(得分:3)

应用程序的每个实例都需要自己的事件空间(或通道),因此其事件不会污染其他实例。如果应用程序实例需要彼此通信,则可能需要进一步的事件空间。根据您使用的事件库,有几种方法可以执行此操作:

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

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

  4. Mediator模式可以与选项1和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);