Как использовать шаблон посредника с несколькими экземплярами посредника в Javascript?

Насколько я понимаю, использование шаблона медиатора выглядит примерно так:

  • Модули только публикуют, но не подписываются. Посредник подписывается на события и заставляет другие модули выполнять действия на основе этих событий.

Например, допустим, у нас есть редактор javascript. Допустим, есть редактор (для кода) и вкладка «Выполнить» (где вы можете щелкнуть «Выполнить» и просмотреть вывод кода). Каждый из них представляет собой отдельный модуль. Когда пользователь нажимает «Выполнить», модуль вкладки «Выполнение» выводит событие, подобное «runButtonClicked», посредник подписывается на это событие и запускает код, когда это событие запускается. Этот пример немного надуманный и упрощенный, но, надеюсь, он дает некоторое представление о том, чего я пытаюсь достичь.

Допустим, у вас есть некий «класс» Mediator, с которым каждый модуль взаимодействует через Pub/Sub.

Если я правильно понимаю этот шаблон, то все это имеет смысл. Но возникает проблема, когда вы хотите иметь несколько экземпляров этого основного «приложения» на странице — как приложение узнает, на какие события реагировать, а какие следует оставить для других экземпляров на странице?

Кажется, мне нужно несколько посредников, но я не уверен, как они будут переданы в объекты.

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

Этот метод кажется проблематичным, потому что мне нужен доступ к этим двум модулям внутри посредника.

Я также слышал о шаблонах песочницы/фасада, используемых с посредником, но я не уверен, поможет ли какой-либо из них (то есть я не очень хорошо в них разбираюсь).

Обновление Я только что нашел шаблон и создание посредника, который выглядит как возможное решение. Но я также хотел бы знать, правильно ли я использую и думаю об этих шаблонах.


person Joshua Kravitz    schedule 25.07.2014    source источник
comment
Посредник подписывается на события и заставляет другие модули выполнять действия на основе этих событий. Можете ли вы привести пример использования? Это может помочь в проверке вашего выбора шаблона.   -  person J E Carter II    schedule 25.07.2014
comment
Просто обновите пример. Это помогает? Идея в этом примере может заключаться в том, что нам нужно несколько экземпляров этого редактора на странице. Как мы справимся с этим с помощью системы обмена сообщениями?   -  person Joshua Kravitz    schedule 26.07.2014


Ответы (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);
person I-Lin Kuo    schedule 26.07.2014
comment
Спасибо! Итак, правильно ли я использую этот шаблон? И есть ли другие шаблоны, которые могут помочь в этой ситуации? - person Joshua Kravitz; 28.07.2014
comment
Еще один вопрос: должен ли посредник заниматься настройкой обработчиков событий (например, по клику). Или это должно обрабатываться в модулях? - person Joshua Kravitz; 28.07.2014
comment
@JoshuaKravitz, когда я впервые изучил шаблоны проектирования, я спросил, есть ли в IDE что-то, что могло бы просто генерировать для меня шаблоны кода. Это был неправильный подход к использованию шаблонов, потому что шаблоны — это не рецепты. Я бы посоветовал вам думать о MP как о принципе разделения ответственности за ваш код. Вы используете MP, чтобы переложить ответственность за управление событиями с модуля на посредника. Вы можете выбрать, сколько ответственности вы хотите снять. - person I-Lin Kuo; 28.07.2014
comment
Спасибо! Это на самом деле очень полезно. Все, что я вижу в Интернете, — это расплывчатые и маленькие примеры, которые трудно применить, но я думаю, это потому, что принципы важнее, чем точные реализации. Еще раз спасибо. - person Joshua Kravitz; 07.08.2014