Перейти к основному содержимому

Что это такое

Паттерн Наблюдатель позволяет одному объекту объявлять о событиях многим подписчикам, не зная, кто они. Подписчики регистрируются один раз; после этого каждое событие автоматически доходит до всех.

Издатель зависит только от небольшого интерфейса подписчика — новые виды слушателей появляются без изменения ни одной строки в издателе. В PHP для этого паттерна даже есть готовые интерфейсы SplSubject и SplObserver; собственный небольшой интерфейс, как ниже, читается не хуже.


Пример: одно оповещение — каждому подписчику

Монитор ведёт список подписчиков. Когда что-то происходит, он оповещает весь список — сегодня это письмо-оповещение и панель; завтра — сообщение в чат, достаточно его подписать.

Публикуем один раз, доставляем всем

Один вызов alert(), две доставки. Монитор не имеет представления, что такое письмо или панель, — он знает лишь о том, что их можно оповестить.

Prompt
Напишите PHP-скрипт с паттерном «Наблюдатель»: интерфейс Subscriber с методом notify, подписчиков EmailAlert и Dashboard, а также издателя Monitor с методами subscribe и alert, который оповещает о событии каждого подписчика. Подпишите оба и вызовите одно оповещение.
Вывод: PHP-скрипт
Publish once, deliver to all

Когда его применять

Применяйте, когда на одни и те же события должны реагировать несколько частей системы и список реагирующих меняется — обновления интерфейса, оповещения, сброс кеша, ленты активности.

Не применяйте, когда получатель ровно один и он фиксирован, — вызывайте его напрямую. Диспетчер событий в более крупном PHP-приложении — это тот же паттерн, только выросший: именованные события, много слушателей, одна точка рассылки.


Плюсы и минусы

Плюсы: издатель и подписчики остаются слабо связанными; подписчики приходят и уходят во время выполнения; новые реакции не требуют изменений в издателе.

Минусы: поток управления становится невидимым — на вопрос «кто на это реагирует?» приходится искать ответ; медленный или падающий подписчик может застопорить цикл оповещения; забытые отписки приводят к утечкам.