В очень простых терминах (потому что другие ответы в любом случае ссылаются на все официальные шаблоны проектирования, поэтому посмотрите на них для получения более подробной информации):
Если вы хотите иметь класс, который отслеживается другими классами в экосистеме вашей программы, вы говорите, что хотите, чтобы этот класс был наблюдаемым. Т.е. могут быть некоторые изменения в его состоянии, которые вы хотели бы передать остальной части программы.
Теперь, чтобы сделать это, мы должны вызвать какой-то метод. Мы не хотим, чтобы класс 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().