From e34ce7b3d3c7e038612a106a4846b3c7acbcad91 Mon Sep 17 00:00:00 2001
From: Peter Hertkorn <peter.hertkorn@reutlingen-university.de>
Date: Sat, 10 Oct 2020 18:39:50 +0200
Subject: [PATCH] Add concurrent composite states

---
 src/soon/PlayZustand.java                     |  6 +-
 ...PowerOnZustand.java => PlayerZustand.java} |  4 +-
 src/soon/PowerOff.java                        |  2 +-
 src/soon/PowerOn.java                         | 66 ++++++++++++++-----
 src/soon/Soon.java                            | 28 ++++++--
 src/soon/SoonTestDrive.java                   |  4 ++
 src/soon/SpeakerZustand.java                  | 13 ++++
 src/soon/StereoZustand.java                   | 13 ++++
 src/soon/StopZustand.java                     |  6 +-
 src/soon/SurroundZustand.java                 | 14 ++++
 src/soon/Zustand.java                         |  1 +
 11 files changed, 125 insertions(+), 32 deletions(-)
 rename src/soon/{PowerOnZustand.java => PlayerZustand.java} (75%)
 create mode 100644 src/soon/SpeakerZustand.java
 create mode 100644 src/soon/StereoZustand.java
 create mode 100644 src/soon/SurroundZustand.java

diff --git a/src/soon/PlayZustand.java b/src/soon/PlayZustand.java
index beddd6c..b952b8d 100644
--- a/src/soon/PlayZustand.java
+++ b/src/soon/PlayZustand.java
@@ -1,6 +1,6 @@
 package soon;
 
-public class PlayZustand extends PowerOnZustand {
+public class PlayZustand extends PlayerZustand {
 	
 	public PlayZustand(Soon s, PowerOn p) {
 		super(s, p);
@@ -8,8 +8,8 @@ public class PlayZustand extends PowerOnZustand {
 	
 	public void stopButton() {
 		exit();
-		p.setZustand(p.getStopZustand());
-		p.getZustand().entry();
+		p.setPlayerZustand(p.getStopZustand());
+		p.getPlayerZustand().entry();
 	}
 
 	public void volumeUpButton() {
diff --git a/src/soon/PowerOnZustand.java b/src/soon/PlayerZustand.java
similarity index 75%
rename from src/soon/PowerOnZustand.java
rename to src/soon/PlayerZustand.java
index 36589af..e531283 100644
--- a/src/soon/PowerOnZustand.java
+++ b/src/soon/PlayerZustand.java
@@ -1,10 +1,10 @@
 package soon;
 
-public abstract class PowerOnZustand {
+public abstract class PlayerZustand {
 	Soon s;
 	PowerOn p;
 	
-	public PowerOnZustand(Soon s, PowerOn p) {
+	public PlayerZustand(Soon s, PowerOn p) {
 		this.s = s;
 		this.p = p;
 	}
diff --git a/src/soon/PowerOff.java b/src/soon/PowerOff.java
index d4e26c4..8ce64a8 100644
--- a/src/soon/PowerOff.java
+++ b/src/soon/PowerOff.java
@@ -7,9 +7,9 @@ public class PowerOff extends Zustand {
 	}
 	
 	public void powerButton() {
+		System.out.println("Power Button: Anschalten");
 		exit();
 		s.setZustand(s.getPowerOnZustand());
-		System.out.println("Anschalten");
 		s.getZustand().entry();
 	}
 }
diff --git a/src/soon/PowerOn.java b/src/soon/PowerOn.java
index fc3ab60..14a141a 100644
--- a/src/soon/PowerOn.java
+++ b/src/soon/PowerOn.java
@@ -1,64 +1,96 @@
 package soon;
 
 public class PowerOn extends Zustand {
-	PowerOnZustand playZustand;
-	PowerOnZustand stopZustand;
+	PlayerZustand playZustand;
+	PlayerZustand stopZustand;
+	SpeakerZustand stereoZustand;
+	SpeakerZustand surroundZustand;
 
-	PowerOnZustand zustand;
+	PlayerZustand playerZustand;
+	SpeakerZustand speakerZustand;
 	
 	public PowerOn(Soon s) {
 		super(s);
 		stopZustand = new StopZustand(s, this);
 		playZustand = new PlayZustand(s, this);
-		zustand = stopZustand;
+		stereoZustand = new StereoZustand(s,this);
+		surroundZustand = new SurroundZustand(s,this);
+		playerZustand = stopZustand;
+		speakerZustand = stereoZustand;
 	}
 	
-	public PowerOnZustand getStopZustand() {
+	public PlayerZustand getStopZustand() {
 		return stopZustand;
 	}
 
-	public PowerOnZustand getPlayZustand() {
+	public PlayerZustand getPlayZustand() {
 		return playZustand;
 	}
 
-	public PowerOnZustand getZustand() {
-		return zustand;
+	public SpeakerZustand getStereoZustand() {
+		return stereoZustand;
+	}
+	
+	public SpeakerZustand getSurroundZustand() {
+		return surroundZustand;
+	}
+	
+	public PlayerZustand getPlayerZustand() {
+		return playerZustand;
 	}
 
-	public void setZustand(PowerOnZustand zustand) {
-		this.zustand = zustand;
+	public void setPlayerZustand(PlayerZustand zustand) {
+		this.playerZustand = zustand;
 	}
 	
+	public SpeakerZustand getSpeakerZustand() {
+		return speakerZustand;
+	}
+
+	public void setSpeakerZustand(SpeakerZustand zustand) {
+		this.speakerZustand = zustand;
+	}
+
 	public void playButton() {
-		zustand.playButton();
+		System.out.println("Play Button");
+		playerZustand.playButton();
 	}
 	
 	public void stopButton() {
-		zustand.stopButton();
+		System.out.println("Stop Button"); 
+		playerZustand.stopButton();
 	}
 	
 	public void volumeUpButton() {
-		zustand.volumeUpButton();
+		System.out.println("Volume Up Button"); 
+		playerZustand.volumeUpButton();
 	}
 	
 	public void volumeDownButton() {
-		zustand.volumeDownButton();
+		System.out.println("Volume Down Button"); 
+		playerZustand.volumeDownButton();
 	}
 
 	public void powerButton() {
+		System.out.println("Power Button: Ausschalten");
 		exit();
 		s.setZustand(s.getPowerOffZustand());
-		System.out.println("Ausschalten");
 		s.getZustand().entry();
 	}
 	
+	public void speakerButton() {
+		System.out.println("Speaker Button"); 
+		speakerZustand.speakerButton();
+	}
+	
+	
 	public void entry() {
 		s.powerLED_On();
-		zustand.entry();
+		playerZustand.entry();
 	}
 	
 	public void exit() {
 		s.powerLED_Off();
-		zustand.exit();
+		playerZustand.exit();
 	}
 }
diff --git a/src/soon/Soon.java b/src/soon/Soon.java
index d03e0df..09822b9 100644
--- a/src/soon/Soon.java
+++ b/src/soon/Soon.java
@@ -3,12 +3,16 @@ package soon;
 public class Soon {
 	Zustand powerOnZustand;
 	Zustand powerOffZustand;
+	PlayerZustand playerHistory;
+	SpeakerZustand speakerHistory;
 	
 	Zustand zustand;
 	
 	public Soon () {
 		powerOnZustand = new PowerOn(this);
 		powerOffZustand = new PowerOff(this);
+		playerHistory = ((PowerOn)powerOnZustand).getStopZustand();
+		speakerHistory = ((PowerOn)powerOnZustand).getStereoZustand();
 		zustand = powerOffZustand;
 	}
 
@@ -48,30 +52,42 @@ public class Soon {
 		zustand.powerButton();
 	}
 
+	public void speakerButton() {
+		zustand.speakerButton();
+	}
+	
 	public void startPlay() {
-		System.out.println("Musik an");
+		System.out.println("Soon: Musik an");
 	}
 	
 	public void stopPlay() {
-		System.out.println("Musik aus");
+		System.out.println("Soon: Musik aus");
 	}
 
 	public void volumeUp() {
-		System.out.println("Lauter");
+		System.out.println("Soon: Lauter");
 	}
 	
 	public void volumeDown() {
-		System.out.println("Leiser");
+		System.out.println("Soon: Leiser");
 	}
 
 	public void powerLED_On() {
-		System.out.println("LED on");
+		System.out.println("Soon: LED on");
 	}
 	
 	public void powerLED_Off() {
-		System.out.println("LED off");
+		System.out.println("Soon: LED off");
 	}
 
+	public void setStereo() {
+		System.out.println("Soon: Stereo sound");
+	}
+	
+	public void setSurround() {
+		System.out.println("Soon: Surround sound");
+	}
+	
 	public String toString() {
 		StringBuffer result = new StringBuffer();
 		result.append("\nSoon MP3 Player");
diff --git a/src/soon/SoonTestDrive.java b/src/soon/SoonTestDrive.java
index 7e3fc47..0e92076 100644
--- a/src/soon/SoonTestDrive.java
+++ b/src/soon/SoonTestDrive.java
@@ -9,8 +9,12 @@ public class SoonTestDrive {
 		
 		player.powerButton();
 		player.playButton();
+		player.speakerButton();
 		player.volumeUpButton();
+		player.powerButton();
+		player.powerButton();
 		player.volumeDownButton();
+		player.speakerButton();
 		player.stopButton();
 		player.powerButton();
 	}
diff --git a/src/soon/SpeakerZustand.java b/src/soon/SpeakerZustand.java
new file mode 100644
index 0000000..9177d8d
--- /dev/null
+++ b/src/soon/SpeakerZustand.java
@@ -0,0 +1,13 @@
+package soon;
+
+public abstract class SpeakerZustand {
+	Soon s;
+	PowerOn p;
+	
+	public SpeakerZustand(Soon s, PowerOn p) {
+		this.s = s;
+		this.p = p;
+	}
+	
+	public void speakerButton() {};
+}
diff --git a/src/soon/StereoZustand.java b/src/soon/StereoZustand.java
new file mode 100644
index 0000000..8cb292a
--- /dev/null
+++ b/src/soon/StereoZustand.java
@@ -0,0 +1,13 @@
+package soon;
+
+public class StereoZustand extends SpeakerZustand {
+
+	public StereoZustand(Soon s, PowerOn p) {
+		super(s, p);
+	}
+
+	public void speakerButton() {
+		s.setSurround();
+		p.setSpeakerZustand(p.getSurroundZustand());
+	}
+}
diff --git a/src/soon/StopZustand.java b/src/soon/StopZustand.java
index 67cf428..92308a0 100644
--- a/src/soon/StopZustand.java
+++ b/src/soon/StopZustand.java
@@ -1,6 +1,6 @@
 package soon;
 
-public class StopZustand extends PowerOnZustand {
+public class StopZustand extends PlayerZustand {
 	
 	public StopZustand(Soon s, PowerOn p) {
 		super(s, p);
@@ -8,7 +8,7 @@ public class StopZustand extends PowerOnZustand {
 	
 	public void playButton() {
 		exit();
-		p.setZustand(p.getPlayZustand());
-		p.getZustand().entry();
+		p.setPlayerZustand(p.getPlayZustand());
+		p.getPlayerZustand().entry();
 	}
 }
diff --git a/src/soon/SurroundZustand.java b/src/soon/SurroundZustand.java
new file mode 100644
index 0000000..a60d3f6
--- /dev/null
+++ b/src/soon/SurroundZustand.java
@@ -0,0 +1,14 @@
+package soon;
+
+public class SurroundZustand extends SpeakerZustand {
+
+	public SurroundZustand(Soon s, PowerOn p) {
+		super(s, p);
+	}
+
+	public void speakerButton() {
+		s.setStereo();
+		p.setSpeakerZustand(p.getStereoZustand());
+	}
+
+}
diff --git a/src/soon/Zustand.java b/src/soon/Zustand.java
index 8a7d896..4bdbadb 100644
--- a/src/soon/Zustand.java
+++ b/src/soon/Zustand.java
@@ -14,4 +14,5 @@ public abstract class Zustand {
 	public void entry() {};
 	public void exit() {};
 	public void powerButton() {};
+	public void speakerButton() {};
 }
-- 
GitLab