Skip to content

Observer

Pandas edited this page Jun 19, 2017 · 1 revision

Назначение

Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом и автоматически обновляются.

Применимость

Используйте паттерн наблюдатель в следующих ситуациях:

  • Когда у абстракции есть два аспекта, один из которых зависит от другого. Инкапсуляции этих аспектов в разные объекты позволяют изменять и повторно использовать их независимо;
  • Когда при модификации одного объекта требуется изменить другие и вы не знаете, сколько именно объектов нужно изменить;
  • Когда один объект должен оповещать других, не делая предположений об уведомляемых объектах. Другими словами, вы не хотите, чтобы объекты были тесно связаны между собой.

Структура

Imgur

Участники

  • Subject - субъект: располагает информацией о своих наблюдателях. За субъектом может «следить» любое число наблюдателей; предоставляет интерфейс для присоединения и отделения наблюдателей;
  • Observer - наблюдатель: определяет интерфейс обновления для объектов, которые должны быть уведомлены об изменении субъекта;
  • ConcreteSubject - конкретный субъект: сохраняет состояние, представляющее интерес для конкретного наблюдателя ConcreteObserver; посылает информацию своим наблюдателям, когда происходит изменение;
  • ConcreteObserver - конкретный наблюдатель: хранит ссылку на объект класса ConcreteSubject; сохраняет данные, которые должны быть согласованы с данными субъекта; реализует интерфейс обновления, определенный в классе Observer, чтобы поддерживать согласованность с субъектом.

Отношения

  • объект ConcreteSubject уведомляет своих наблюдателей о любом изме нении, которое могло бы привести к рассогласованности состояний наблю дателя и субъекта;
  • после получения от конкретного субъекта уведомления об изменении объ ект ConcreteObserver может запросить у субъекта дополнительную информацию, которую использует для того, чтобы оказаться в состоянии, согласованном с состоянием субъекта.
  • Отметим, что объект Observer, который инициирует запрос на изменение, откладывает свое обновление до получения уведомления от субъекта. Опера ция Notify не всегда вызывается субъектом. Ее может вызвать и наблюдатель, и посторонний объект.

Результаты

Паттерн наблюдатель позволяет изменять субъекты и наблюдатели независимо друг от друга. Субъекты разрешается повторно использовать без участия наблюдателей, и наоборот. Это дает возможность добавлять новых наблюдателей без модификации субъекта или других наблюдателей. Рассмотрим некоторые достоинства и недостатки паттерна наблюдатель:

  • Абстрактная связанность субъекта и наблюдателя. Субъект имеет информацию лишь о том, что у него есть ряд наблюдателей, каждый из которых подчиняется простому интерфейсу абстрактного класса Observer.
  • Поддержка широковещательных коммуникаций. В отличие от обычного запроса для уведомления, посылаемого субъектом, не нужно задавать определенного получателя. Уведомление автоматически поступает всем подписавшимся на него объектам.
  • Неожиданные обновления. Поскольку наблюдатели не располагают информацией друг о друге, им неизвестно и о том, во что обходится изменение субъекта.

Clone this wiki locally