Observer (Наблюдатель) – шаблон проектирования в Java


 
Как следует из названия, он используется для наблюдения за несколькими объектами. Observer следит за любыми изменениями в состоянии или свойствах объекта. Предположим, вы заинтересованы в конкретном объекте и хотите получить уведомление, когда его состояние изменится, то когда произойдет изменение состояния или свойства объекта вы получите уведомление.
 
Как описано в GoF(Gang of Four – книга "Банды четырех"):
 
«Определяет взаимосвязь между объектами таким образом, что все зависимые объекты оповещаются и обновляются автоматически».
 
Наблюдатель не будет контролировать каждый раз, есть ли какие-либо изменения в состоянии объекта или нет, так как они будут уведомлены для каждого изменения состояния объекта, пока они не перестанут наблюдать объект. Отсюда следует принцип Голливуда – «Не звоните нам, мы сами позвоним вам».
 
Некоторые примеры из реальной жизни:
Вы заходите в интернет-магазин и ищете какой либо продукт, а он недоступен, то в опциях можно выбрать параметр - «Уведомить меня, когда товар будет доступен». Если вы выбрали эту опцию, то когда состояние продукта изменится, то есть он будет доступен, вы получите уведомление на почту «Продукт доступен, теперь вы можете купить его». В этом случае продукт это наблюдаемый объект, а вы наблюдатель (Observer).
 
Допустим, ваш постоянный адрес прописки изменился, тогда вы должны уведомить соответствующие органы. В этом случае вы будете наблюдаемым, а соответствующие органы власти наблюдателями. Так же на фейсбуке, если вы подписываетесь на кого-то тогда всякий раз, когда будет происходить обновление, вы будете уведомлены. 
 
 
Когда это применяется:
 
• Когда один объект меняет свое состояние, то все зависящие объекты автоматически меняют свое состояние для обеспечения соответствия.
• Когда объект не знает о количестве наблюдателей.
• Когда объект должен быть в состоянии уведомить другие объекты не зная объектов.
 
Компоненты (детальное описание даёт учебник Java 8):
 
Объект 
• Знает своих наблюдателей
• Имеет любое число наблюдателей
• Предоставляет интерфейс для подсоединения и отсоединения объектов вовремя выполнения.
 
Наблюдатель
• Предоставляет интерфейс обновления для приема сигнала от объекта.
 
Конкретный объект
• Хранит состояние конкретных интересующих объектов.
• Отправляет уведомление наблюдателю.
 
Конкретный наблюдатель
• Поддерживает ссылку на конкретный объект объекта
• Поддерживает наблюдение состояния в соответствии с объектами
• Реализует процедуру обновления
Источник: 
Shagir.ru