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

Что это такое

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

Издатель зависит только от небольшого интерфейса подписчика — новые виды слушателей появляются без единой изменённой строки в издателе.


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

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

Опубликовать один раз, доставить всем

Один вызов Alert() — две доставки. Монитор не имеет ни малейшего понятия, что такое электронное письмо или панель мониторинга: он знает только объекты, которые можно уведомить.

Prompt
Напишите программу на Go с паттерном Observer: интерфейс Subscriber с методом Notify, подписчики EmailAlert и Dashboard, а также издатель Monitor с методами Subscribe и Alert, который уведомляет о событии каждого подписчика. Подпишите обоих и подайте один сигнал тревоги.
Вывод: программа на Go и захваченный вывод
Publish once, deliver to all

Когда его использовать

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

Не используйте, когда получатель ровно один и он неизменен — вызывайте его напрямую. В конкурентных программах на Go сначала рассмотрите каналы: в них уже встроены передача событий с обратным давлением и select.


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

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

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