据我了解,使用调解器模式如下所示:
模块仅发布,但不订阅。调解器订阅事件,并使其他模块根据这些事件来做事。
例如,假设我们有一个javascript编辑器。假设有一个编辑器(用于代码)和运行选项卡(您可以在其中单击运行并查看代码的输出)。每个都是自己的模块。当用户单击运行时,运行选项卡模块将输出类似“ runButtonClicked”的事件,调解器将预订该事件并在触发该事件时运行代码。这个例子有些人为地简化了,但希望它能使我对我要实现的目标有所了解。
因此,假设您有一些“类” Mediator
,每个模块都通过Pub / Sub与之通信。
如果我正确地理解了这种模式,那么这一切都是有道理的。但是,当您要在页面上拥有此核心“应用程序”的多个实例时,似乎会出现问题-应用程序如何知道要响应的事件以及页面上其他实例应该剩下哪些事件?
似乎我想要多个介体,但是我不确定如何将它们传递到对象中。
var mediator = new Mediator();
var moduleOne = new moduleOne(mediator);
var moduleTwo = new moduleTwo(mediator);
这种方法似乎有问题,因为我想访问中介器中的这两个模块。
我也听说过调解员正在使用沙箱/立面模式,但是我不确定这两种模式是否有帮助(也就是说,我不太了解它们)。
更新资料
我刚刚找到了Mediator pattern and creation,这似乎是一个可能的解决方案。但是我也想知道我是否正在正确使用和考虑这些模式。
最佳答案
应用程序的每个实例将需要其自己的事件空间(或通道),因此其事件不会污染其他实例。如果应用程序实例需要互相交谈,则可能需要更多的事件空间。根据您使用的事件库,有几种方法可以执行此操作:
jQuery事件支持名称空间,因此,如果每个应用程序实例都有唯一的名称,则可以将应用程序名称用作名称空间来分隔事件。
EventEmitter库支持创建多个EventEmitter实例,这与jQuery不同,事件由jQuery单例管理。在这种情况下,您可以将其自己的EventEmitter实例附加到每个应用程序。
如果您的库没有用于创建事件空间的良好机制,则也可以使用调解器模式进行滚动。在这种情况下,可以为每个名称空间创建一个介体。
介体模式可以与选项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);
关于javascript - 如何在Javascript中将调解器模式与多个调解器实例一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24962186/