В чем разница между шаблонами Observer и Pub-Sub?
Однажды меня спросили в одном из интервью: «В чем разница между шаблоном Observer и шаблоном Pub-Sub?». Я сразу понял, что Pub-Sub означает «Publisher—Subscriber», и тогда я точно вспомнил строку из книги «Head first Design Pattern» что:
Publishers + Subscribers = Observer Pattern
«Я понял, я понял. Вы не сможете обмануть меня». — подумал я.
Я ответил с победной улыбкой: «Они одинаковы«.
Но интервьюер улыбнулся в ответ, как будто он поймал меня и сказал: «Нет, это не так«.
Итак, что я пропустил? Почему все пошло не так? Вернувшись домой, я решил найти ответ, погуглив. Этот пост результат моего поиска.
Прежде чем углубится в разницу, давайте сначала немного поговорим о паттернах «Observer» и «Pub-Sub».
Шаблон Observer:
Я думаю, что многие согласятся со мной, что шаблон Observer является одним из самых простых шаблонов проектирования из всех. Я имею в виду, в отличие от большинства других шаблонов проектирования, вы можете по крайней мере «почувствовать» или легко понять, его основную концепция при первом чтении.
Шаблон observer — это шаблон, в котором объект, называемый subject, ведет список зависимых объектов, называемых observers, и автоматически уведомляет их о любых изменениях состояния, обычно вызывая один из их методов.
Видите, даже определение в Wikipedia не так сложна, верно? Если вам еще что то непонятно, давайте поясним это определение попроще.
Допустим, вы ищете работу инженера-программиста и очень заинтересованы в компании под названием «Banana Inc.». Итак, вы связались с их менеджером по найму и дали ему свой контактный номер. Он заверил вас, что если будет какая-то вакансия, они сообщат вам. Есть и другие заинтересованные кандидаты, такие как вы. Поэтому они решили сообщать всем кандидатам о вакансии и, возможно, если вы ответите, они пригласят вас на собеседование. Итак, как этот сценарий связан с шаблоном Observer? Здесь компания «Банана Инк.» является Subject, который ведет список всех Observers (кандидатов, таких как вы) и при определенном событии event то есть появление вакансии, оповещают всех notify. Разве это не просто?
Таким образом, если вам когда-либо понадобится реализовать этот сценарий в каком-либо программном обеспечении или приложении, вы можете следовать этому алгоритму и потом всем сказать, что вы внедрили «Шаблон проектирования Observer». (Я не раздуваю свою статью, показывая какой-либо пример кода, потому что есть множество примеров, доступных в Интернете)
Шаблон Pub-Sub(Publisher-Subscriber):
Да, Subject в шаблоне Observer похож на издателя (Publisher), и Observer может быть полностью похожим на подписчика (Subscriber), и да, Subject уведомляет Observers о событие, как Publisher обычно уведомляет своих Subscribers. Вот почему большинство книг или статей Design Pattern используют понятие «Publisher-Subscriber», чтобы объяснить шаблон дизайна Observer. Основное различие между (реальным) шаблоном «Publisher-Subscriber» и шаблоном «Observer» заключается в следующем:
В шаблоне «Publisher-Subscriber» отправители сообщений, называемые publishers, сами ничего не знают о получателях subscribers, соответственно не создают сообщения, которые будут отправлены непосредственно определенным получателям,.
То есть это означает, что publisher и subscriber не знают о существовании друг друга. Существует третий компонент, называемый посредником, посредником сообщений или шиной событий, о котором знает как publisher, так и subscriber, и который фильтрует все входящие сообщения и распределяет их соответствующим образом. Другими словами, pub-sub — это шаблон, используемый для обмена сообщениями между различными компонентами системы, когда эти компоненты ничего не знают об друг друге. Как посредник фильтрует все сообщения? На самом деле, есть несколько процессов для фильтрации сообщений. Наиболее популярные методы: Topic-based и Content-based. Я не буду в это углубляться, если вам интересно, можете посмотреть в Wikipedia.
Если сказать об этом в двух словах, основное различие между этими двумя шаблонами может быть показано таким образом:
Понятно?
Давайте кратко перечислим различия:
- В шаблоне Observer Obeservers знают о Subject, а также Subject ведет учет Observers. В то же время в Publisher/Subscriber publishers и subscribers не чего не знают друг о друге. Они просто общаются с помощью очередей сообщений или брокера.
- В шаблоне Publisher/Subscriber компоненты слабо связаны, в отличие от шаблона «Observer».
- Шаблон Observer в основном реализуется синхронно, т.е. Subject вызывает соответствующий метод всех своих observers, когда происходит какое-то событие. Шаблон Publisher/Subscriber в основном реализуется асинхронно (с использованием очереди сообщений).
- Шаблон Observer должен быть реализован в одном адресном пространстве приложения. С другой стороны, шаблон Publisher/Subscriber является скорее кросс компонентным шаблоном.
Несмотря на различия между этими шаблонами, некоторые могут сказать, что шаблон Publisher-Subscriber является вариацией шаблона Observer из-за концептуального сходства между ними. И в чем это так и есть. Не нужно принимать различия буквально и религиозно. Они похожи, не так ли?
Что ж, пока это все. Надеюсь, вы поняли идею. Спасибо за чтение статьи. Пожалуйста, дайте мне знать, если есть какие-либо ошибки или какие-либо изменения, необходимые. Заранее спасибо.
Оригинальная статья: Ahmed shamim hassan — Observer vs Pub-Sub pattern
А зачем вы шаблоны на интервью обсуждаете? лол