Проще говоря (потому что другие ответы в любом случае отсылают вас ко всем официальным шаблонам дизайна, просмотрите их для получения дополнительных сведений):
Если вы хотите иметь класс, который контролируется другими классами в экосистеме вашей программы, вы говорите, что хотите, чтобы класс был наблюдаемым. Т.е. в его состоянии могут быть некоторые изменения, которые вы хотите передать остальной части программы.
Теперь, чтобы сделать это, мы должны вызвать какой-то метод. Мы не хотим, чтобы класс Observable был тесно связан с классами, которые заинтересованы в его наблюдении. Его не волнует, кто это, если он соответствует определенным критериям. (Представьте, что это радиостанция, ей все равно, кто ее слушает, если на их частоту настроено FM-радио). Для этого мы используем интерфейс, называемый Observer.
Следовательно, класс Observable будет иметь список наблюдателей (то есть экземпляров, реализующих методы интерфейса 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()
), прежде чем продолжить уведомление. Существует две версии: одна без аргументов, а другая с аргументом Object
, на случай, если вы хотите передать дополнительную информацию с уведомлением. Внутренне происходит то, что он просто перебирает список экземпляров Observer
и вызывает _ 17_ для каждого из них. Это сообщает Observer
, который был измененным наблюдаемым объектом (вы могли наблюдать более одного), и дополнительному Object arg
, чтобы потенциально нести некоторую дополнительную информацию (передаваемую через notifyObservers()
.
person
jbx
schedule
06.12.2012