Шаблон наблюдателя против шаблона публикации-подписки

Шаблоны проектирования
Шаблон наблюдателя против шаблона публикации-подписки

Оригинальный адрес:zhuanlan.zhihu.com/p/51357583
Автор: Уиллоу

В одном из интервью интервьюер спросил:

В чем разница между шаблоном наблюдателя и шаблоном публикации-подписки?

Мне сразу же пришли в голову слова из Head First Design Patterns:

Publishers + Subscribers = Observer Pattern

"Хмф, я знаю ответ, брат деи!", мое сердце было очень холодным.

«Они одинаковы». Я привык успокоиться, а рот открыл улыбку, как если бы следующий второй пробный представитель отправит мне предложение.

Интервьюер тоже рассмеялся».нет, они не одинаковы".

Тогда я просто:

Итак, почему я ошибаюсь? В чем разница между шаблоном Observer и шаблоном Publish-Subscribe?

Шаблон наблюдателя

На самом деле так называемый режим наблюдателяслабо связанный.

Используя метеостанцию ​​в «шаблоне проектирования Head First» в качестве примера, всякий раз, когда обновляются данные измерений погоды,changed()будет вызван метод, поэтому мы можемchanged()В методе обновите данные о метеоприборе, такие как температура, атмосферное давление и т.д.

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

Как это решить? Используйте шаблон наблюдателя, программирование, ориентированное на интерфейс, и добейтесь слабой связи.

В режиме наблюдателяchanged()Экземплярный объект, в котором находится метод, является Observable (Subject или Observable). Ему нужно только поддерживать набор наблюдателей. Эти наблюдатели реализуют один и тот же интерфейс. Субъекту нужно только знать, что при уведомлении наблюдателя ему нужно вызов Какой единый подход был бы хорош:

Код сюда выкладывать не буду, в интернете и так много информации.

модель публикации-подписки

Наверное, многие, как и я, думают, что Издатель в режиме публикации-подписки — это Субъект в режиме наблюдателя, а Подписчик — это Наблюдатель. Когда издатель изменится, он будет активно уведомлять подписчика.

Вообще-то нет.

В модели публикации-подписки издатель не уведомляет подписчика напрямую, другими словами, издатель и подписчик не знают друг друга.

Не знаете друг друга? Как они общаются друг с другом?

Ответ — через третью сторону, то есть в очередь сообщений, брокера, которого мы часто называем Брокером.

Издателю нужно только сообщить Брокеру, что тема сообщения, которое я хочу отправить, — ААА;

Подписчик должен только сказать брокеру, что я хочу подписаться на сообщение, тема которой является AAA;

Таким образом, когда Брокер получил от издателя отправленное мне сообщение, а тема — ААА, сообщение будет отправлено подписчикам темы — подписчикам ААА. Конечно, может подписчик подтянуться, посмотреть на реализацию.

Другими словами, в модели «публикация-подписка» издатель и подписчик связаны не слабо, а полностью разъединены.

Поместите минималистическую картинку, чтобы сравнить различия между этими двумя режимами:

Суммировать

На поверхности:

  • В режиме наблюдателя есть только две роли - наблюдатель + наблюдаемый
  • Режим публикации-подписки, но не только издатели и подписчики две роли, есть часто пропускаемая нами - Брокер Брокер

Идем глубже:

  • Наблюдатель и наблюдаемое слабо связаны
  • Издатели и подписчики, связи нет вообще

От уровня использования:

  • Шаблон наблюдателя, в основном используемый внутри одного приложения.
  • Режим публикации-подписки больше похож на кросс-приложение, такое как наше часто используемое промежуточное ПО для сообщений.

В конце концов, все мои слова - пародия на эту статью:Observer vs Pub-Sub pattern