Является ли Eventbus паттерном посредника или наблюдателя?

Eventbus — это больше посредник или наблюдатель? По данным Google, «посредник шины событий» получает 2430 обращений, а «наблюдатель шины событий» — 3850 обращений.

Судя по описанию, они бы оба соответствовали тому, что я пытался сделать (медиатор даже чуть больше). Так реализует ли eventbus конкретный шаблон или мне решать, что я говорю?


person Stefan    schedule 12.05.2011    source источник


Ответы (5)


Часто данный фрагмент кода по своей сути не является примером того или иного шаблона. Вот почему они называются «шаблонами» (а не, скажем, «методами реализации»). Многие программы выглядят как один паттерн, но в то же время похожи на другой — это хорошо. Лучше не придерживаться шаблонов ради шаблонов, а использовать их как общий словарь для обсуждения архитектуры.

EventBus — один из таких инструментов. Я написал его с учетом ситуаций, подобных наблюдателю, но если вы правильно структурируете свое приложение, оно может играть роль посредника.

person Cliff L. Biffle    schedule 14.02.2012

Обычно EventBus используется для запуска событий. Для этого лучше подходит слово «наблюдатель». Шаблон наблюдателя использует события или сообщения для уведомления об изменении объектов, представляющих интерес, о наблюдаемом (изменяемом) объекте. Посредник также пытается разъединить две реализации, но он более конкретен, чем Observer, в том смысле, что он может знать все о двух объектах/интерфейсах и работает как связующее звено, чтобы заставить эти два работать. Observer не утверждает, что знает что-то о внутренностях или даже об интерфейсе. Все, что он знает или заботится о том, когда происходит событие, он должен уведомить заинтересованные объекты.

Медиатор может быть настройкой для конкретного сценария, тогда как Наблюдатель может быть более общим.

EventBus почти всегда является синглтоном в рамках приложения, я бы определенно отнес EventBus к категории использующих Observer, поскольку его реальное намерение в большинстве случаев состоит в том, чтобы облегчить глобальный обмен сообщениями между различными модулями/объектами в вашей среде выполнения.

person skipy    schedule 23.06.2012

Я бы сказал, что типичная шина событий использует оба этих шаблона:

  • шина событий по существу инкапсулирует способ взаимодействия других объектов, поэтому она является посредником
  • объекты, которые регистрируются как обработчики/слушатели событий, являются наблюдателями (и субъектами их наблюдений являются типы событий и/или объекты, которые производят эти события, не сама шина), поэтому Википедия говорит, что шаблон наблюдателя "в основном используется для реализации распределенные системы обработки событий" (выделено мной), но шина событий сама по себе не является наблюдателем.
person morgwai    schedule 24.05.2017
comment
Просто наткнулся на это и хотел проголосовать и расширить ответ комментарием - на самом деле, возвращаясь к книге Go4, они говорят (в разделе «Реализация»), что объект «Посредник» в шаблоне «Посредник» может быть реализован как наблюдатель. Таким образом, узоры могут смешиваться друг с другом. Как всегда, различие заключается в цели/намерении: Mediator используется для обработки логики взаимодействия как отдельной задачи, и ему просто нужно определить некоторый тип коммуникационного интерфейса для объектов Colleague. Целью Observer является поддержка взаимодействия публикации и подписки (событий). - person Filip Milovanović; 16.03.2018

wikipedia: Суть шаблона посредника заключается в том, чтобы «определить объект, который инкапсулирует то, как взаимодействует набор объектов».

EventBus этого не делает.

EventBus также не является шаблоном наблюдателя, потому что, если у вас есть N объектов и вы хотите обмениваться данными между всеми ними, вам нужно N * N наблюдателей, если вы используете шаблон наблюдателя, но для выполнения той же работы достаточно только одного глобального EventBus.

Итак, EventBus — это паттерн EventBus.

person jhegedus    schedule 23.07.2014
comment
Не уверен, что полностью следую линии о необходимости N˟N наблюдателей. Если всем N объектам необходимо взаимодействовать друг с другом, то каждый объект является одновременно издателем и подписчиком. Итак, у вас есть N подписчиков (наблюдателей), у каждого по N подписок. Подписка — это просто вызов метода, который регистрирует один объект с другим; он не создает нового наблюдателя, поэтому общее количество наблюдателей по-прежнему равно N. Вам может понадобиться N˟N вызовов метода, если производителям требуется одна подписка за раз; но в современном приложении вся эта первоначальная проводка, вероятно, в любом случае будет выполняться контейнером DI. - person jaco0646; 17.01.2019
comment
Event Bus — это не шаблон проектирования, а сочетание трех шаблонов проектирования: Singleton, Observer и Mediator. Это синглтон, потому что вам нужен только 1 экземпляр шины. Это Наблюдатель, потому что у вас есть издатели-подписчики. Это Посредник, потому что у вас есть объект, который инкапсулирует то, как взаимодействует множество объектов (шина). Таким образом, шина событий — это не шаблон, а конкретная реализация трех шаблонов. - person Jorge Riv; 27.05.2019

Поскольку в предисловии говорится «[API публикации/подписки», я бы выбрал Observer.

person Simone    schedule 12.05.2011
comment
вроде нормально, но я также заметил, что наблюдатель и посредник очень похожи. - person Stefan; 12.05.2011
comment
Да. Отличие в том, что в Наблюдателе субъект знает список наблюдателей и управляет им. Тем не менее, Википедия[en.wikipedia.org/wiki/Observer_pattern] предлагает публиковать/подписываться сам по себе является шаблоном, поэтому я думаю, что этот вопрос является спорным. - person Simone; 12.05.2011