Паттерн Observer и Pub/Sub
Не случайно я хочу рассмотреть этот паттерн в первую очередь. Во-первых его назначение абсолютно понятно, и любой javascript-разработчик возможно даже не подозревает как часто он его использует.
Observer
Observer, переводя на русский язык, означает “Наблюдатель”. Логично предположить, что если есть наблюдатель, то должен быть и предмет его наблюдения. Например, человек, который увлекается рыбалкой, постоянно является наблюдателем, когда смотрит на неподвижный поплавок. Естественно, целью наблюдения за поплавком является событие, которое заставит предпринять какое-либо действие.
Переводя описанное выше на технические термины, можно выделить следующие детали. Паттер “Observer” полезен, когда:
- Есть наблюдаемый объект (subject) - в нашем случае - поплавок;
- Есть наблюдатель (object) - в нашем случае - рыбак;
- Есть событие (event) - в нашем случае - поплавок дергается;
- Есть действие (event handler) - в нашем случае - действие рыбака (предположим, он дергает удачку).
Другими словами, использование паттерна нужно, когда 2 независимых объекта должны быть связаны между собой посредством какого-нибудь события.
Чуть выше, я говорил о том, что многие не представляют, что уже постоянно используют этот подход. Посмотрим на пример:
1 | $('button').on('click', function(){ |
Да, конструкция, которую знает даже школьник. Ну или продвинутый школьник. При клике на кнопку, мы хотим выводить сообщение о том, что кнопка нажата. Чувствуете аналогию с рыбаком? При подергивании поплавка - вынимай удочку.
- Subject в данном случае - кнопка (button);
- Object - документ;
- Event, очевидно, клик;
- Event Handler - функция, которая будет вызвана при возникновении события.
Pub/Sub
По сути Pub/Sub это отдельно взятая реализация Observer. Можно сказать, подмножество или прием. Суть в нем та же самая. Есть небольшие различия в терминологии, но чтобы не забивать голову терминами, я не стану их тут приводить. Название Pub/Sub - это сокращение от Publisher/Subscriber (Издатель/Подписчик). Так на самом деле легче всего запомнить этот паттерн.
Рассмотрим пример из жизни. Существуют различные газетные издательства. Саша считает себя крайне либеральным человеком, посему любит читать новости газеты Freedom. А Маша любит читать новости из разных источников, в том числе противоположных по взгляду: газету Freedom и журнал Union. Когда Саша получает свежий номер газеты, он ходит и трубит всем вокруг о том, что прочел. Маша же формулирует свои мысли в некий блог.
Вот, пожалуй что и готовый пример для программирования.
1 | //Опишем объект "Издатель" |
Поиграться с живым примером, можно в JS Fiddle.
Хочу добавить, что я привел очень простой пример паттерна, чтобы не захламлять код терминологией и дополнительными методами. Но, по-хорошему, у издателя должен быть реализован метод по отписке (unsubscribe) наблюдателей. И правда, что если взгляды Саши изменятся, и он решит отписаться от газеты Freedom и начать читать только журнал Union?
Предлагаю этот пример реализовать самостоятельно, в качестве домашнего задания.