Objekt soll Anwendung über Änderungen informieren

kwohs

Mitglied
Hallo liebes Forum,

ich habe ein Beispiel zur objektorientierten Modellierung einer Uhr vorliegen, das in Delphi realisiert wurde und versuche dieses Beispiel in Java umzusetzen. Die Klassenhierarchie sieht vor, dass zunächst eine Klasse "Zähler" entworfen wird, diese wird zu einer Klasse "Zähler_mit_Obergrenze". Eine Klasse "Uhr" besitzt drei Zählerobjekte (zum Zählen von Stunde, Minute, Sekunde), sie läuft noch nicht eigenständig. Von dieser Klasse abgeleitet wird eine Klasse "Uhr_mit_Timer".

In einer Anwendungsoberfläche wird die Uhr_mit_Timer über einen Button gestartet. Sie läuft nun selbständig, zur Anzeige der aktuellen Zeit auf der Anwendungsoberfläche muss allerdings ein weiterer Button "anzeigen" betätigt werden, dabei wird eine Prozedur "write()" in der GUIKlasse aufgerufen.

Bis dahin klappt alles, nun stehe ich allerdings vor dem Problem, dass in einem letzten Schritt das Uhrenobjekt selbständig die GUIKlasse über Änderungen informieren soll, also anders gesagt: Die Anwendung soll erfahren, dass sich die Uhrzeit geändert hat und die Darstellung auf der Oberfläche selbständig anpassen.

In Delphi sieht das ganze relativ einfach aus, da bekommt die Uhrenklasse (wenn ich das so richtig interpretiere...) eine Variable, die auf eine Methode zeigt, die dann in der Anwendung mit einer passenden Prozedur (hier: write() ) verknüpft wird.
Nur wie mache ich das in Java?

Grüße, kwohs
 
Ich würde das spontan so machen. Du erstellst in der GUIKlasse eine Methode update, die die neuen Werte übergibt. Diese Methode rufst du nach jeder Sekunde auf und zeichnest dein Interface neu.
Java:
    public void update(int hour, int min, int sec){
        this.hour = hour;
        this.min = min;
        this.sec = sec;
    }
 
Hm, ich glaube, das entspricht nicht meiner Zielvorstellung:
Das Ganze ist so gedacht, dass die Klasse "Uhr" die GUIKlasse permanent über Zustandsänderungen informiert und dabei in der GUIKlasse eine Methode zur Aktualisierung aktiviert. Die GUIKlasse selbst ist quasi passiv, sie stellt nur eine Methode zur Verfügung, die von der Uhrenklasse bei Änderung aufgerufen werden kann (in dem mir vorliegenden Delphi-Beispiel weiß die Uhrenklasse nicht, wie die Methode der GUIKlasse heißt, sie weiß nur, dass diese Methode (hier) parameterlos ist und "zeigt" auf diese Methode, die bei Änderung aufgerufen werden soll. Wenn der Konstruktor des Anwendungsformulars aufgerufen wird (in der Delphi-Variante), dann wird er auch gleich darüber informiert, dass bei Änderung des Úhrenobjekts die Ereignismethode write() für die Aktualisierung der Anzeige aufgerufen werden muss). So etwas Ähnliches suche ich für die Übersetzung dieses Beispiels einer Uhrenanwendung in Java...
 
Naja, entweder die gui aktualisiert sich nach dem Aufruf einer Änderung selbst (und lädt die Uhr neu) , oder die Uhr ruft die Methode aktualisiere der gui auf nachdem eine Änderung eingegangen ist. Ansonsten schau dir mal das observer pattern an.
 
üblicherweise nutzt man für sowas das observer pattern.
Am besten legst du dir ein interface an:
Java:
public interface ClockListener {
  public void update(Clock clock);
}
Deine Uhr hat dann eine Liste von Listenern und ruft bei einer Änderung diese auf um sie zu benachrichtigen
Java:
public class Clock {
  private List<ClockListener> listener = new ArrayList<ClockListener>();
  public void addListener(ClockListener cl) {
    listener.add(cl);
  }
  // ...
  // hier passieren Änderungen
  private void tick() {
    // .. Uhrzeit ändert sich
    for(ClockListener cl : listener) cl.update(this); // Alle Listener benachrichtigen
  }
}
Deine GUI würde dann ClockListener implementieren, sich selbst als Listener anmelden und in der Update Methode die Uhr neu zeichnen.

Mit Java 8 kann man das ganze dann noch etwas kürzer und näher an der Delphi Variante gestalten.
Falls dich das interessiert, kannste ja mal nach "Java 8 Lambda Ausdrücke" googlen
 
Danke für die Hinweise. Das sieht dann doch deutlich komplizierter aus, als die entsprechende Realisierung in meiner Delphi-Vorlage. Mal schauen, ob ich das hinbekomme...
 
Es hat geklappt (juchhu...), mein Uhrenobjekt sorgt jetzt für die Aktualisierung der Anzeige auf der Anwendung. Ich habe trotzdem noch eine Frage:
Die Uhrenklasse legt ja eine ganze Liste für Beobachter an. Ich würde das gerne einfacher halten, es soll nur einen einzigen Beobachter (die GUI-Anwendung) geben. Daher brauche ich eigentlich keine Liste. Kann ich auf die Liste verzichten? Ich hab's probiert, hat nicht funktioniert, aber ich weiß nicht, ob es "grundsätzlich" nicht möglich ist oder ich das ganze einfach nur fehlerhaft umgesetzt habe?
 
Im Prinzip ist es nicht notwendig das umzubiegen. Die Liste hält ja nur ein Item, und ich glaub belegt sich Speicherplatz für 10 Items vor. Der Unterschied ist ziemlich gering. Ich denke nicht, dass du so performant/speicherplatzeffizient sein musst, dass das ins Gewicht fällt.

Auf der anderen Seite ist es schon möglich den Speicher für die Beobachter auf eine Variable zu reduzieren. Aber um dir dafür helfen zu können wären Codeausschnitte und die Fehlermeldunge(en) notwendig.
 

Zurück
Oben