Дуже простими словами (оскільки інші відповіді так чи інакше стосуються вас всіх офіційних моделей дизайну, тому подивіться на них для отримання детальної інформації):
Якщо ви хочете мати клас, який контролюється іншими класами в екосистемі вашої програми, ви говорите, що хочете, щоб цей клас був спостережливим. Тобто в його стані можуть бути якісь зміни, які ви хотіли б транслювати на решту програми.
Тепер для цього нам потрібно закликати якийсь метод. Ми не хочемо, щоб спостерігаючий клас був тісно поєднаний з класами, які зацікавлені спостерігати за ним. Байдуже, хто це, доки він відповідає певним критеріям. (Уявіть, що це радіостанція, байдуже, хто слухає, доки у них FM-радіо налаштоване на їх частоту). Для цього ми використовуємо інтерфейс, який називають спостерігачем.
Таким чином, клас Observable матиме список спостерігачів (тобто екземпляри, що реалізують методи інтерфейсу Observer, які ви могли мати). Щоразу, коли він хоче щось транслювати, він просто викликає метод всіх спостерігачів, один за одним.
Останнє, що слід закрити головоломку - як дізнається клас спостерігачів, хто цікавиться? Таким чином, клас спостереження повинен запропонувати певний механізм, який дозволить спостерігачам зареєструвати свій інтерес. Метод, такий як addObserver(Observer o)
внутрішньо, додає спостерігача до списку спостерігачів, так що коли щось важливе відбувається, він переходить через список і викликає відповідний метод сповіщення інтерфейсу спостерігача кожного екземпляра у списку.
Може бути, в інтерв'ю вони не просили вас явно про 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
примірників і викликає update(Observable o, Object arg)
метод для кожного з них. Це говорить про те, Observer
що був об'єктом Спостережуваного, який змінився (ви могли спостерігати більше одного), а додатковим, Object arg
щоб потенційно нести додаткову інформацію (передану через notifyObservers()
.