Наблюдатель (Observer) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Участники)
(Достоинства и недостатки)
Строка 44: Строка 44:
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
* Минимальная связанность субъекта и наблюдателя: субъект знает лишь о том, что у него есть ряд наблюдателей с простым интерфейсом Update()
 +
* Широковещательность оповещения: субъект оповещает не конкретного, а всех подписанных на него наблюдателей
 +
* Непредвиденные обновления. Изменение субъекта может вызвать каскад зависимых от него наблюдателей с высокой стоимостью обновления.
 +
* Протокол обновления не содержит никаких сведений о том, что изменилось в субъекте - работа наблюдателей при этом усложняется.
  
 
=== Варианты ===
 
=== Варианты ===
 
*
 
*

Версия 11:46, 21 июля 2014

К основной странице курса

Другое имя

Издатель-Подписчик (Publisher-Subscriber)

Назначение

При изменении состояния одного объекта все зависимые от него объекты (подписчики) оповещаются об обновлении.

Описание

В системе, в которой одни объекты зависят от других, необходимо согласованное обновление информации.

Ключевыми в паттерне Наблюдатель являются Субъект и Наблюдатель. У Субъекта может быть сколько угодно зависимых от него наблюдателей.

Все наблюдатели уведомляются об изменениях в состоянии субъекта. Получив уведомление, наблюдатель опрашивает Субъекта с тем чтобы синхронизировать с ним своё состояние.

Использование

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

Реализация

Диаграмма классов

ObserverCommon.png

Участники

  • Subject - субъект
    • Хранит список своих наблюдателей
    • Предоставляет интерфейс для присоединения и отсоединения наблюдателей
    • Имеет метод оповещения всех подписанных на него наблюдателей
  • Observer - наблюдатель
    • Определяет метод Update() для обновления состояния потомков наблюдателя
  • ConcreteSubject - конкретный субъект
    • Имеет состояние, представляющее интерес дял конкретного наблюдателя
    • Посылает информацию наблюдателям, когда происходит изменение
  • ConcreteObserver - конкретный наблюдатель
    • Хранит ссылку на своего субъекта, за изменением состояния которого он следит.
    • Сохраняет на своей стороне данные, которые должны быть согласованы с данными субъекта
    • Реализует метод Update()

Диаграмма последовательности

Файл:.png

Пример

Достоинства и недостатки

  • Минимальная связанность субъекта и наблюдателя: субъект знает лишь о том, что у него есть ряд наблюдателей с простым интерфейсом Update()
  • Широковещательность оповещения: субъект оповещает не конкретного, а всех подписанных на него наблюдателей
  • Непредвиденные обновления. Изменение субъекта может вызвать каскад зависимых от него наблюдателей с высокой стоимостью обновления.
  • Протокол обновления не содержит никаких сведений о том, что изменилось в субъекте - работа наблюдателей при этом усложняется.

Варианты