Em termos muito simples (porque as outras respostas referem-se a todos os padrões oficiais de design de qualquer maneira, consulte-os para obter mais detalhes):
Se você deseja ter uma classe que é monitorada por outras classes no ecossistema do seu programa, você diz que deseja que a classe seja observável. Ou seja, pode haver algumas mudanças em seu estado que você deseja transmitir para o restante do programa.
Agora, para fazer isso, precisamos chamar algum tipo de método. Não queremos que a classe Observable seja fortemente acoplada às classes que estão interessadas em observá-la. Não se importa quem é, desde que cumpra determinados critérios. (Imagine que é uma estação de rádio, não importa quem está ouvindo, desde que tenha um rádio FM sintonizado em sua frequência). Para conseguir isso, usamos uma interface, conhecida como Observador.
Portanto, a classe Observable terá uma lista de Observadores (ou seja, instâncias que implementam os métodos de interface do Observer que você possa ter). Sempre que deseja transmitir algo, apenas chama o método a todos os observadores, um após o outro.
A última coisa a encerrar o quebra-cabeça é como a classe Observable saberá quem está interessado? Portanto, a classe Observable deve oferecer algum mecanismo para permitir que os Observadores registrem seu interesse. Um método como addObserver(Observer o)o adiciona internamente o Observador à lista de observadores, de modo que quando algo importante acontece, ele percorre a lista e chama o método de notificação respectivo da interface do Observador de cada instância da lista.
Pode ser que na entrevista que eles não pedir-lhe explicitamente sobre o java.util.Observere java.util.Observable, mas sobre o conceito genérico. O conceito é um padrão de design, para o qual o Java fornece suporte diretamente pronto para uso, para ajudá-lo a implementá-lo rapidamente quando necessário. Então, eu sugiro que você entenda o conceito em vez dos métodos / classes reais (que você pode procurar quando precisar deles).
ATUALIZAR
Em resposta ao seu comentário, a java.util.Observableclasse real oferece os seguintes recursos:
Mantendo uma lista de java.util.Observerinstâncias. Novas instâncias interessadas em ser notificadas podem ser adicionadas addObserver(Observer o)e removidas deleteObserver(Observer o).
Manter um estado interno, especificando se o objeto foi alterado desde a última notificação aos observadores. Isso é útil porque separa a parte em que você diz que Observablefoi alterada e a parte em que você notifica as alterações. (Por exemplo, é útil se você tiver várias alterações e deseja notificar apenas no final do processo, e não em cada pequena etapa). Isso é feito completamente setChanged(). Então, basta chamá-lo quando você altera algo para o Observablee deseja que o resto Observerssaiba eventualmente sobre ele.
Notificando todos os observadores que o específico Observablemudou de estado. Isso é feito completamente notifyObservers(). Isso verifica se o objeto realmente mudou (ou seja, setChanged()foi feita uma chamada ) antes de prosseguir com a notificação. Existem 2 versões, uma sem argumentos e outra com um Objectargumento, caso deseje passar algumas informações extras com a notificação. Internamente, o que acontece é que ele apenas percorre a lista de Observerinstâncias e chama o update(Observable o, Object arg)método para cada uma delas. Isso indica Observerqual foi o objeto Observável que foi alterado (você pode estar observando mais de um) e o extra Object argpara potencialmente levar algumas informações extras (transmitidas notifyObservers().