Allora, vediamo innanzitutto la cosa a livello concettuale (poi se vuoi del codice di esempio, si può fare).
Ti è chiaro innanzitutto come si può realizzare il meccanismo di "callback" (richiamata, volendolo tradurre in italiano) tramite una interfaccia Java? C'è una interfaccia X che dichiara un metodo astratto (o più di uno). Una classe C riceve 1 oggetto che implementa X, lo può ricevere tramite costruttore o con un metodo apposito, non ha molta importanza ora. Notare che alla classe C non interessa di che classe è quell'oggetto ricevuto, a C basta "vederlo" di tipo X, la interfaccia. Quando un oggetto di classe C vuole "notificare" qualcosa, invoca quel metodo di X sull'oggetto che si è tenuto da qualche parte come variabile di istanza.
Attenzione che questo NON è un Observer, né un listener (listener intendendo anche proprio quelli specifici di AWT/Swing). È semplicemente l'uso basilare, minimale della programmazione ad oggetti per realizzare un meccanismo di "callback". Le interfacce si usano solitamente proprio per rappresentare un "contratto" tra due parti.
Il Observer è un design pattern specifico, che può fare certamente uso delle interfacce. Infatti l'entità "observer" (chi osserva e riceve le notifiche) è generalmente descritto a livello astratto da una interfaccia. Il "soggetto" (Subject o anche Observable) che è l'entità da cui si originano le notifiche tipicamente dovrebbe essere anch'esso descritto da una interfaccia, sebbene in casi specifici possa essere una classe concreta.
Una implementazione del pattern Observer è già presente nel framework standard, dove java.util.Observer è una interfaccia mentre java.util.Observable è una classe concreta. Il fatto che sia una classe può ovviamente essere un limite a seconda di dove lo si vorrebbe usare.
Questa nel framework comunque è solo una possibile implementazione, chiunque ne può realizzare un'altra più in linea con il design pattern Observer "teorico".
Un Observer però è qualcosa di più del meccanismo di callback detto prima: innanzittutto la questione concettuale è che l'Observer si usa tipicamente quando si vuole notificare un cambiamento di stato di un oggetto (es. una proprietà dell'oggetto che cambia valore).
Inoltre nel pattern Observer il soggetto tipicamente mantiene un elenco di N osservatori, quindi non solo uno. E tipicamente viene permessa l'aggiunta così come anche la rimozione di un osservatore.
Quando si parla di listener bisogna precisare se si intende il termine in senso generale (un "ascoltatore", come potrebbe essere la callback detta all'inizio) oppure se si intende in modo specifico i listener come quelli delle interfacce grafiche AWT/Swing. I listener di AWT/Swing sono una "specializzazione" del pattern Observer e in AWT/Swing sono implementati usando una serie di linee guida e convenzioni ben precise.
Tra l'altro i listener di AWT/Swing servono più in generale per notificare "eventi", quindi non necessariamente un cambio di stato di un oggetto.
Fin qui è tutto chiaro?