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