В очень простых терминах (потому что другие ответы в любом случае ссылаются на все официальные шаблоны проектирования, поэтому посмотрите на них для получения более подробной информации):
Если вы хотите иметь класс, который отслеживается другими классами в экосистеме вашей программы, вы говорите, что хотите, чтобы этот класс был наблюдаемым. Т.е. могут быть некоторые изменения в его состоянии, которые вы хотели бы передать остальной части программы.
Теперь, чтобы сделать это, мы должны вызвать какой-то метод. Мы не хотим, чтобы класс Observable был тесно связан с классами, которые заинтересованы в его наблюдении. Неважно, кто это, пока он отвечает определенным критериям. (Представьте, что это радиостанция, не важно, кто слушает, если у них FM-радио настроено на частоту). Для этого мы используем интерфейс, называемый Observer.
Поэтому класс Observable будет иметь список Observers (т.е. экземпляры, реализующие методы интерфейса Observer, которые могут у вас быть). Всякий раз, когда он хочет что-то транслировать, он просто вызывает метод для всех наблюдателей, один за другим.
Последнее, что нужно закрыть, - как класс Observable узнает, кому это интересно? Таким образом, класс Observable должен предлагать некоторый механизм, позволяющий наблюдателям регистрировать свои интересы. Такой метод, какaddObserver(Observer o)
внутреннее добавление Observer в список наблюдателей, так что, когда происходит что-то важное, он проходит по списку и вызывает соответствующий метод уведомления интерфейса Observer для каждого экземпляра в списке.
Может быть, в интервью они не просили вас явно о java.util.Observer
иjava.util.Observable
а о общей концепции. Эта концепция является шаблоном проектирования, который, как оказалось, в Java предоставляет поддержку прямо из коробки, чтобы помочь вам быстро реализовать его, когда вам это нужно. Поэтому я хотел бы предложить вам понять концепцию, а не фактические методы / классы (которые вы можете найти, когда они вам нужны).
ОБНОВИТЬ
В ответ на ваш комментарий реальный java.util.Observable
класс предлагает следующие возможности:
Ведение списка java.util.Observer
экземпляров. Новые экземпляры, заинтересованные в получении уведомлений, могут быть добавлены addObserver(Observer o)
и удалены deleteObserver(Observer o)
.
Поддержание внутреннего состояния, указание, изменился ли объект с момента последнего уведомления наблюдателей. Это полезно, потому что отделяет ту часть, где вы говорите, что Observable
она изменилась, от той части, где вы уведомляете об изменениях. (Например, это полезно, если у вас происходит несколько изменений, и вы хотите уведомлять об этом только в конце процесса, а не на каждом небольшом шаге). Это сделано до конца setChanged()
. Таким образом, вы просто называете это, когда вы что-то изменили на, Observable
и вы хотите, чтобы остальная часть Observers
со временем узнала об этом.
Уведомление всех наблюдателей о том, что конкретное Observable
состояние изменилось. Это сделано до конца notifyObservers()
. Это проверяет, действительно ли объект изменился (то есть setChanged()
был сделан вызов ), прежде чем приступить к уведомлению. Есть 2 версии, одна без аргументов и одна с Object
аргументом, если вы хотите передать некоторую дополнительную информацию с уведомлением. Внутренне происходит то, что он просто перебирает список Observer
экземпляров и вызывает update(Observable o, Object arg)
метод для каждого из них. Это говорит о том, Observer
какой объект Observable изменился (вы могли наблюдать более одного), и дополнительный, Object arg
чтобы потенциально нести некоторую дополнительную информацию (пропущенную через notifyObservers()
.