Оригинальный адрес: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