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.Observer
e 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.Observable
classe real oferece os seguintes recursos:
Mantendo uma lista de java.util.Observer
instâ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 Observable
foi 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 Observable
e deseja que o resto Observers
saiba eventualmente sobre ele.
Notificando todos os observadores que o específico Observable
mudou 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 Object
argumento, caso deseje passar algumas informações extras com a notificação. Internamente, o que acontece é que ele apenas percorre a lista de Observer
instâncias e chama o update(Observable o, Object arg)
método para cada uma delas. Isso indica Observer
qual foi o objeto Observável que foi alterado (você pode estar observando mais de um) e o extra Object arg
para potencialmente levar algumas informações extras (transmitidas notifyObservers()
.