Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中对多个中介实例使用中介模式?_Javascript_Design Patterns_Mediator_Facade - Fatal编程技术网

如何在Javascript中对多个中介实例使用中介模式?

如何在Javascript中对多个中介实例使用中介模式?,javascript,design-patterns,mediator,facade,Javascript,Design Patterns,Mediator,Facade,据我所知,使用中介模式类似于: 模块只发布,不订阅。中介订阅事件,并使其他模块基于这些事件执行操作 例如,假设我们有一个javascript编辑器。假设有一个编辑器(用于代码)和一个运行选项卡(您可以在其中单击运行并查看代码的输出)。每个模块都有自己的模块。当用户单击run时,run选项卡模块输出一个类似“runButtonClicked”的事件,中介订阅该事件,并在触发该事件时运行代码。这个例子有点做作和简化,但希望这能让我了解我想要实现的目标 假设您有一些“类”Mediator,每个模块

据我所知,使用中介模式类似于:


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

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

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

看起来我需要多个中介,但我不确定这些中介将如何传递到对象中

var mediator = new Mediator();
var moduleOne = new moduleOne(mediator);
var moduleTwo = new moduleTwo(mediator);
这种方法似乎有问题,因为我希望访问中介中的这两个模块

我也听说过中介使用沙箱/门面模式,但我不确定这两种模式是否有用(也就是说,我不太了解它们)

更新
我刚刚发现,这似乎是一个可能的解决办法。但我也想知道我是否正确地使用和思考了这些模式。

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

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

  • 如果您的库没有良好的创建事件空间的机制,您也可以使用mediator模式启动自己的程序。在这种情况下,可以为每个命名空间创建一个中介

  • 中介模式可以与选项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将管理事件的责任从模块转移到中介。您可以选择要卸下多少责任。谢谢!这其实很有帮助。我在网上看到的都是模糊的小例子,很难应用,但我想这是因为原则比具体的实现更重要。再次感谢。