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

Eventbus - больше Медиатор или Наблюдатель? По данным Google, "посредник Eventbus" получает 2,430 обращений, а "наблюдатель Eventbus" - 3,850 обращений.

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

Ответ 1

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

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

Ответ 2

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

Посредник может быть специфичной для сценария, тогда как Observer может быть более общим.

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

Ответ 3

wikipedia: Суть шаблона посредника - "Определить объект, который инкапсулирует, как взаимодействует набор объектов"

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

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

Итак, EventBus - это шаблон EventBus.

Ответ 4

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

  • шина событий существенно инкапсулирует, как взаимодействуют другие объекты, поэтому является посредником
  • объекты, которые регистрируются как обработчики/слушатели событий, являются наблюдателями (и субъектами их наблюдений являются типы событий и/или объекты, которые производят эти события, не сама шина), так как wikipedia говорит шаблон наблюдателя в основном используется для реализации распределенных систем обработки событий strong > "(выделение мое), но шина событий не наблюдателя как такового.

Ответ 5

Поскольку в предисловии говорится: "[...] опубликовать/подписаться API", я бы пошел на Observer.