Я думаю, что одним из основных отличий является контекст проблемы.
Хотя проблему можно решить с помощью любого шаблона, реальные проблемы:
1: «Сколько изменений, вызванных событиями, зависит от общего контекста?»
2: «Как часто слушатели должны меняться?»
Классический случай для шаблона-посредника лучше всего иллюстрирует это, когда у вас есть сложный пользовательский интерфейс со множеством компонентов, а обновление каждого из них имеет сложную взаимозависимость от состояния других подобных компонентов.
Хотя вы можете решить эту проблему с помощью шаблона pub / sub; где ваши компоненты прослушивают события и содержат логику, необходимую для обновления, объект контекста (вместе с событием) несет всю необходимую информацию. Здесь преимущество, очевидно, заключается в правильной инкапсуляции логики, относящейся к компоненту внутри себя. Недостатком является то, что если такие компоненты должны часто меняться, то вам придется полностью повторять эту логику в каждом новом компоненте, который вы вводите.
Использование посредника означает введение еще одного слоя и дальнейшее абстрагирование от компонентов. Эти компоненты становятся тоньше, так как они имеют дело только с представлением (внешний вид пользовательского интерфейса), поэтому их очень легко менять. Единственная проблема, с которой я сталкиваюсь при таком подходе, состоит в том, что логика обновления теперь, похоже, распространяется на другие компоненты, и любое обновление системы потребует изменения логики компонента и посредника, если поведение компонента также изменится.
Для меня это главная дилемма / компромисс, который мы должны решить. Пожалуйста, поправьте меня, если я ничего не понял правильно.