Алгоритмы

В чем разница между шаблонами Observer и Pub-Sub?

Spread the love

Однажды меня спросили в одном из интервью: «В чем разница между шаблоном Observer и шаблоном Pub-Sub?». Я сразу понял, что Pub-Sub означает «PublisherSubscriber», и тогда я точно вспомнил строку из книги «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 design pattern (A bird’s eye view :P)

Таким образом, если вам когда-либо понадобится реализовать этот сценарий в каком-либо программном обеспечении или приложении, вы можете следовать этому алгоритму и потом всем сказать, что вы внедрили «Шаблон проектирования 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.

Pub-Sub Pattern (image credit: MSDN blog)

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

Image source: developers-club

Понятно?

Давайте кратко перечислим различия:

  • В шаблоне 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 hassanObserver vs Pub-Sub pattern

Была ли вам полезна эта статья?
[15 / 4.8]

Spread the love
Editorial Team

View Comments

  • А зачем вы шаблоны на интервью обсуждаете? лол

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

11 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

11 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago