Wie lässt sich ein Wert nach dessen Änderung z.B. auf mehreren Textfeldern synchronisiert darstellen?

In Java (und vielen anderen objektorientierten Programmiersprachen) bietet sich hierfür das Entwurfsmuster (Design-Pattern) des 'Observer-Pattern' an, das jedoch in den verschiedenen Sprachen sehr unterschiedlich implementiert wurde. Das Prinzip gestaltet sich allerdings gleich: ein einzelner 'Erzähler' möchte, dass eine von ihm gesandte Nachricht von einer beliebigen Vielzahl von 'Zuhörern' wahrgenommen wird.
Im Beispiel, wird ein vorgegebener, vom 'Erzaehler' mitgeteilter Text, in den Textfeldern mehrerer 'Zuhörer' präsentiert.

Die die Daten bereitstellende Klasse, der 'Erzähler' erweitert die Klasse Observable. Sie stellt die Methode addObserver() bereit, die hier im Konstruktor eine Instanz eines Observers, dem 'Zuhörer', zur Gesamtheit aller beobachtenden Objekte hinzufügt.
Die Methode setChanged() der Klasse Observable registriert die Veränderung des Observable-Objekts, so dass die Methode hasChanged() true liefern würde. Der Aufruf von notifyObservers() bewirkt nun, dass die angemeldeten Observer, das als Parameter übergebene Objekt geliefert bekommen und gleichzeitig die Änderung als abgearbeitet registriert wird, sodass ein hasChanged() false ergeben würde.

class Erzaehler extends Observable {
    
    public Erzaehler(){
        this.addObserver(new Zuhoerer_1());
        this.addObserver(new Zuhoerer_2());
        tell("laber, laber...");
    }

    
    public void tell(String info){
        if(countObservers()>0){
            setChanged();
            notifyObservers(info);
        }
    }
}

Die beobachtenden Objekte, die Zuhörer, müssen das Interface Observer mit dessen einziger Methode update() implementieren. Sie weist zwei Argumente auf: das beobachtete Objekt und die Änderung in Form einer Object-Instanz. Im Beispiel wird ein String übergeben, der im Textfeld des 'Zuhörers' wiedergegeben wird und den ursprünglichen ersetzt.

class Zuhoerer extends JFrame implements Observer{
    
    private JTextField field;
    
    public Zuhoerer(){
        field1 = new JTextField("a");
        add(field);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 50);
        setVisible(true);
    }
    
    public void update(Observable o, Object arg) {
        field.setText((String) arg);
    }
}


gesamter Quelltext:

import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class ObserverClass {
    public static void main(String[] args) {
        new Erzaehler();
    }
}

class Erzaehler extends Observable {
    
    public Erzaehler(){
        this.addObserver(new Zuhoerer_1());
        this.addObserver(new Zuhoerer_2());
        tell("hoihoi!");
    }

    
    public void tell(String info){
        if(countObservers()>0){
            setChanged();
            notifyObservers(info);
        }
    }
}

class Zuhoerer_1 extends JFrame implements Observer{
    
    private JTextField field1;
    
    public Zuhoerer_1(){
        field1 = new JTextField("a");
        add(field1);
        
        setTitle("Zuhoerer 1");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 50);
        setVisible(true);
    }
    
    public void update(Observable o, Object arg) {
        field1.setText((String) arg);
    }
}

class Zuhoerer_2 extends JFrame implements Observer{
    
    private JTextField field2;
    
    public Zuhoerer_2(){
        field2 = new JTextField("b");
        add(field2);
        
        setTitle("Zuhoerer 2");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 50);
        setVisible(true);
    }
    
    public void update(Observable o, Object arg) {
        field2.setText((String) arg);
    }
}