Nicht so kompliziert wie Lingo es erklärt:
Ein Subject hat Daten und eine Liste welche Objekte (Observer) bescheid bekommen wollen, wenn sich die Daten ändern. Dann geht er die Observerliste durch und sagt allen Observern, dass es ein Update gab. Deswegen ein Interface für Observer, damit überall die Methode .update() verfügbar ist. Was die Observer dann damit machen ist ihr Bier.
In der reinen Lehre werden in .update() keine Daten übergeben, davon kann aber abgewichen werden.

Beispiel Liste mit Anzeige
Subject
public interface Subject {
void registerObserver(Observer o);
void unregisterObserver(Observer o);
void notifyObservers();
}Concrete Subject
import java.util.ArrayList;
public class InputSubject implements Subject {
private ArrayList<Observer> observers = new ArrayList<>();
private ArrayList<String> inputs = new ArrayList<>();
@Override
public void registerObserver(Observer o) {observers.add(o);}
@Override
public void unregisterObserver(Observer o) {observers.remove(o);}
@Override
public void notifyObservers() {
for (Observer o : observers) {
o.update();
}
}
public ArrayList<String> getInputs() {return inputs;}
public void addInput(String input) {
inputs.add(input);
this.notifyObservers();
}
}Observer
public interface Observer {
void update();
}Concrete Observer
public class ListTextObserver implements Observer {
TextArea outputField;
InputSubject subject;
public ListTextObserver(TextArea outputField, InputSubject subject) {
this.outputField = outputField;
this.subject = subject;
}
@Override
public void update() {
outputField.clear();
for(String input: subject.getInputs()){
outputField.appendText(input + "\n");
}
}
}Main
InputSubject subject;
public void initialize() {
subject = new InputSubject();
subject.registerObserver(new LatestTextObserver(textFieldLatestText, subject));
subject.registerObserver(new ListTextObserver(textFieldList, subject));
}
@FXML
protected void onSaveButtonClick() {
subject.addInput(txtInput.getText());
}