User Tools

Site Tools


observerable

Java - Observable

Oft hat man das Problem, dass eine grafische Oberfläche bei Änderungen eines Objekts aktualisiert werden muss. Ganz elegant geht dies mit dem Observer/Observable-Modell:

Das Objekt, das Änderungen weiter melden soll, heißt “Observable”. Bei ihm müssen sich alle anmelden, die über Änderungen informiert werden wollen.

  • Observables müssen die Klasse Observable erweitern.
  • Oberserver müssen das Interface Observer implementieren.

Im folgenden Beispiel ist die Klasse A ein Zuhörer (Observer), die Klasse B dient als Erzähler (Observable). Das Testprogramm generiert einige Aktionen für zwei Erzähler. Die Zuhörer nehmen die Änderungen wahr und melden dies in der Konsole.

Bei grafischen Oberflächen ist (nach meinem bisherigen Kenntnisstand) anzumerken, dass ein Hauptprogramm, das JFrames erweitert, nicht direkt die Funktion eines Zuhörers (Observer) haben kann. Hier müssen spezielle Erweiterungen für Textfelder etc. angelegt werden, die diese Funktion übernehmen.

/**
* Observer / Observable - Modell
*/
import java.util.Observer;
import java.util.Observable;
 
class A implements Observer {
    private String name;
    public A( String name ) { this.name = name; }
    @Override
    public void update( Observable o, Object arg ) {
        B b = (B) arg;
        System.out.print( name + " : " + b.getInfo() );
    }
    public static void main(String[] args) {
        A a = new A("Test");
    }
}
 
 
/**
* Das Objekt B kann von Objekten beobachtet werden.
*/
class B extends Observable  {
    private String name;
    private int count = 0;
    public B(String n) { name   = n; }
    public String getInfo() { return "\tName "+name+" Counter = "+count+"\n"; }
    public int getCounter() { return count; }
    public void incCounter() {
        count++;
        setChanged();
        notifyObservers( this );
    }
}
 
public class ObserverTest {
    public static void main(String[] args) {
        B b1 = new B("B1");
        B b2 = new B("B2");
        A a1  = new A("A1");
        A a2  = new A("A2");
        b1.addObserver(a1);   // a1 hört auf beide Objekte b1 und b2
        b2.addObserver(a1);
        b2.addObserver(a2);   // a2 hört nur auf Objekt b2
        for (int i=0; i<15; i++) {
            if (i%3==0) b2.incCounter(); else b1.incCounter();
        }
    }
}
observerable.txt · Last modified: 2024/03/11 10:38 by walter