From 5ed9c683bbc333371a1c360ad723a7aefc864873 Mon Sep 17 00:00:00 2001 From: Peter Hertkorn <peter.hertkorn@reutlingen-university.de> Date: Thu, 12 Nov 2020 18:58:50 +0100 Subject: [PATCH] Use javabeans library for observer pattern --- .../AktuelleBedingungenAnzeige.java | 31 +++++++------ src/wetterstation/EigenschaftenSubjekt.java | 11 ----- src/wetterstation/StatistikAnzeige.java | 43 +++++++++++-------- src/wetterstation/VorhersageAnzeige.java | 25 ++++++----- src/wetterstation/WetterDaten.java | 25 ++++++++--- 5 files changed, 74 insertions(+), 61 deletions(-) delete mode 100644 src/wetterstation/EigenschaftenSubjekt.java diff --git a/src/wetterstation/AktuelleBedingungenAnzeige.java b/src/wetterstation/AktuelleBedingungenAnzeige.java index c84afb0..d4d8eb1 100644 --- a/src/wetterstation/AktuelleBedingungenAnzeige.java +++ b/src/wetterstation/AktuelleBedingungenAnzeige.java @@ -1,30 +1,33 @@ package wetterstation; -import java.util.Observable; -import java.util.Observer; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; -public class AktuelleBedingungenAnzeige implements Observer { +public class AktuelleBedingungenAnzeige implements PropertyChangeListener { private float temperatur; private float feuchtigkeit; WetterDaten wetterDaten; public AktuelleBedingungenAnzeige(WetterDaten wetterDaten) { this.wetterDaten = wetterDaten; - wetterDaten.addPropertyListener(this); + wetterDaten.addPropertyChangeListener(this); } - public void update(Observable o, Object arg) { - if (o instanceof EigenschaftenSubjekt) { - WetterDaten daten = (WetterDaten) arg; - this.temperatur = daten.getTemperatur(); - this.feuchtigkeit = daten.getFeuchtigkeit(); - anzeigen(); + public void propertyChange(PropertyChangeEvent e) { + switch (e.getPropertyName()) { + case "Temperatur": + this.temperatur = (float)e.getNewValue(); + System.out.println("Aktuelle Bedingungen: " + temperatur + + " Grad C"); + break; + case "Feuchtigkeit": + this.feuchtigkeit = (float)e.getNewValue(); + System.out.println("Aktuelle Bedingungen: " + feuchtigkeit + "% Luftfeuchtigkeit"); + break; + default: + break; } } - public void anzeigen() { - System.out.println("Aktuelle Bedingungen: " + temperatur - + " Grad C und " + feuchtigkeit + "% Luftfeuchtigkeit"); - } } diff --git a/src/wetterstation/EigenschaftenSubjekt.java b/src/wetterstation/EigenschaftenSubjekt.java deleted file mode 100644 index db1d219..0000000 --- a/src/wetterstation/EigenschaftenSubjekt.java +++ /dev/null @@ -1,11 +0,0 @@ -package wetterstation; - -import java.util.Observable; - -public class EigenschaftenSubjekt extends Observable { - public void firePropertyChange(WetterDaten wetterDaten) { - setChanged(); - notifyObservers(wetterDaten); - } - -} diff --git a/src/wetterstation/StatistikAnzeige.java b/src/wetterstation/StatistikAnzeige.java index b194323..2e3926e 100644 --- a/src/wetterstation/StatistikAnzeige.java +++ b/src/wetterstation/StatistikAnzeige.java @@ -1,9 +1,9 @@ package wetterstation; -import java.util.Observable; -import java.util.Observer; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; -public class StatistikAnzeige implements Observer { +public class StatistikAnzeige implements PropertyChangeListener { private float maxTemp = 0.0f; private float minTemp = 200; private float tempSum= 0.0f; @@ -12,27 +12,32 @@ public class StatistikAnzeige implements Observer { public StatistikAnzeige(WetterDaten wetterDaten) { this.wetterDaten = wetterDaten; - wetterDaten.addPropertyListener(this); + wetterDaten.addPropertyChangeListener(this); } - public void update(Observable o, Object arg) { - if (o instanceof EigenschaftenSubjekt) { - WetterDaten daten = (WetterDaten) arg; - float temp = daten.getTemperatur(); - tempSum += temp; - anzMesswerte++; + public void propertyChange(PropertyChangeEvent e) { + float temp; + + switch (e.getPropertyName()) { + case "Temperatur": + temp = (float)e.getNewValue(); + tempSum += temp; + anzMesswerte++; - if (temp > maxTemp) { - maxTemp = temp; - } - - if (temp < minTemp) { - minTemp = temp; - } + if (temp > maxTemp) { + maxTemp = temp; + } + + if (temp < minTemp) { + minTemp = temp; + } - anzeigen(); + anzeigen(); + break; + default: + break; } - } + } public void anzeigen() { System.out.println("Mit/Max/Min Temperatur = " + (tempSum / anzMesswerte) diff --git a/src/wetterstation/VorhersageAnzeige.java b/src/wetterstation/VorhersageAnzeige.java index 25cda82..d33adb7 100644 --- a/src/wetterstation/VorhersageAnzeige.java +++ b/src/wetterstation/VorhersageAnzeige.java @@ -1,26 +1,29 @@ package wetterstation; -import java.util.Observable; -import java.util.Observer; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; -public class VorhersageAnzeige implements Observer { +public class VorhersageAnzeige implements PropertyChangeListener { private float aktuellerLuftdruck = 29.92f; private float letzterLuftdruck; WetterDaten wetterDaten; public VorhersageAnzeige(WetterDaten wetterDaten) { this.wetterDaten = wetterDaten; - wetterDaten.addPropertyListener(this); + wetterDaten.addPropertyChangeListener(this); } - public void update(Observable o, Object arg) { - if (o instanceof EigenschaftenSubjekt) { - WetterDaten daten = (WetterDaten) arg; - letzterLuftdruck = aktuellerLuftdruck; - aktuellerLuftdruck = daten.getLuftdruck(); - anzeigen(); + public void propertyChange(PropertyChangeEvent e) { + switch (e.getPropertyName()) { + case "Luftdruck": + letzterLuftdruck = aktuellerLuftdruck; + aktuellerLuftdruck = (float)e.getNewValue(); + anzeigen(); + break; + default: + break; } - } + } public void anzeigen() { System.out.print("Vorhersage: "); diff --git a/src/wetterstation/WetterDaten.java b/src/wetterstation/WetterDaten.java index bbfeafb..0d4336b 100644 --- a/src/wetterstation/WetterDaten.java +++ b/src/wetterstation/WetterDaten.java @@ -1,28 +1,41 @@ package wetterstation; -import java.util.Observer; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; public class WetterDaten extends SensorDaten { private float temperatur; private float feuchtigkeit; private float luftdruck; - private EigenschaftenSubjekt subjekt; + private float old_temperatur; + private float old_feuchtigkeit; + private float old_luftdruck; + private PropertyChangeSupport changes; public WetterDaten() { - subjekt = new EigenschaftenSubjekt(); + changes = new PropertyChangeSupport(this); } - public void addPropertyListener(Observer o) { - subjekt.addObserver(o); + public void addPropertyChangeListener(PropertyChangeListener l) { + changes.addPropertyChangeListener(l); + } + + public void removePropertyChangeListener(PropertyChangeListener l) { + changes.removePropertyChangeListener(l); } public void messwerteGeaendert() { System.out.println(this.toString()); - subjekt.firePropertyChange(this); + changes.firePropertyChange("Temperatur", old_temperatur, temperatur); + changes.firePropertyChange("Feuchtigkeit", old_feuchtigkeit, feuchtigkeit); + changes.firePropertyChange("Luftdruck", old_luftdruck, luftdruck); } public void setMesswerte(float temp, float feucht, float druck) { + old_temperatur = this.temperatur; + old_feuchtigkeit = this.feuchtigkeit; + old_luftdruck = this.luftdruck; this.temperatur = temp; this.feuchtigkeit = feucht; this.luftdruck = druck; -- GitLab