Я немного удивлен, что все ответы здесь пытались объяснить тонкую разницу между шаблонами Observer и Pub / Sub без каких-либо конкретных примеров. Бьюсь об заклад, большинство читателей до сих пор не знают, как реализовать каждый из них, читая один синхронно, а другой асинхронно.
Стоит отметить, что целью этих шаблонов является попытка отделить код
Observer - это шаблон проектирования, в котором объект (известный как субъект) поддерживает список объектов в зависимости от него (наблюдателей), автоматически уведомляя их о любых изменениях состояния.
Образец наблюдателя
Это означает, что у observable object
него есть список, в котором он хранит все свои данные observers
(которые обычно являются функциями). и может пройти этот список и вызвать эти функции, когда он чувствует себя хорошо.
см. этот пример шаблона наблюдателя для деталей.
Этот шаблон хорош, когда вы хотите прослушать любое изменение данных на объекте и соответственно обновить другие представления пользовательского интерфейса.
Но минусы - это наблюдаемые, которые поддерживают только один массив для хранения наблюдателей
(в этом примере это массив observersList
).
Это НЕ дифференцирует, как обновление инициировано, потому что у него есть только один notify function
, которая запускает все функции, хранящиеся в этом массиве.
Если мы хотим сгруппировать обработчики наблюдателей на основе разных событий. Нам просто нужно изменить observersList
это Object
как
var events = {
"event1": [handler1, handler2],
"event2": [handler3]
}
см. этот пример pubsub для деталей.
и люди называют эту вариацию как pub/sub
. Таким образом, вы можете запускать различные функции в зависимости от events
опубликованных вами.