Паттерн Observer (Наблюдатель).

Паттерн Observer состоит из двух основных компонентов — наблюдаемого объекта — Observable и собственно самих наблюдателей — Observers. Наблюдатели могут подписаться на изменения основного объекта. Как только этот объект изменяется, то они тут же оповещаются об этом изменении. Например, множество графических компонентов должны обновить свое состояние при поступлении в систему новых данных.

Данный паттерн также известен под названием Publisher/Subscriber(издатель/подписчик).

Ниже представлена диаграмма данного паттерна:

pattern_observer

Итак, у нас есть несколько компонентов:

  • Subject — это объект, за состоянием которого наблюдают подписчики. Обычно он содержит в себе минимум три основных метода: attach(подписаться), detach(отписаться) и notify(уведомить). Последний метод вызывается каждый раз, как только наблюдаемый объект меняет свое состояние. Обычно в нем в цикле обходятся все объекты-подписчики и у каждого из них вызывается метод update().
  • Observer — это объект-наблюдатель. Основной метод — update(), содержит код, который должен быть выполнен при изменении состояния наблюдаемого объекта.
  • ConcreteSubject — это конкретная реализация наблюдаемого объекта.
  • ConcreteObserver — это конкретная реализация объекта-наблюдателя.

Типовая реализация данного паттерна на языке Java может выглядеть следующим образом.

Сначала создадим интерфейс Observer, который представляет наблюдателя:

Он содержит всего один метод update(), который вызывается в ответ на уведомление об изменениях основного объекта. Обратите внимание, что в методе update() мы передаем ссылку на сам субъект. Это одна из распространенных реализаций паттерна Наблюдатель, когда необходимо передать какую-то дополнительную информацию о характере произошедших изменений.

Конкретной реализации класса-наблюдателя нужно реализовать данный интерфейс:

Ниже представлено описание интерфейса Subject, который содержит в себе все три основных метода.

Теперь приведем частичную реализацию данного интерфейса в виде абстрактного класса AbstractSubject:

Создать конкретного субъекта можно простым наследованием от AbstractSubject:

А вот так в коде можно создать субъект и несколько наблюдателей, которые подпишутся на его обновления.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *