Skip to content

Commit 0a3e884

Browse files
authored
Add state design pattern implementations with tests (#54)
1 parent 39edef1 commit 0a3e884

File tree

13 files changed

+232
-0
lines changed

13 files changed

+232
-0
lines changed

DesignPatterns/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ with practical examples and best practices for using design patterns to create r
1212
- [Command](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/command) 📝
1313
- [Execute Around Method (EAM)](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/eam)
1414
- [Observer](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/observer) 👀
15+
- [State](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/state) 📜
1516
- [Strategy](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/strategy) 🎯
1617
- [Template Method](src/main/java/pl/mperor/lab/java/design/pattern/behavioral/template/method) 📋
1718

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.flow;
2+
3+
record GreenLight() implements TrafficLightState {
4+
5+
@Override
6+
public void change(TrafficLight trafficLight) {
7+
trafficLight.setState(new YellowLight());
8+
}
9+
10+
@Override
11+
public void display() {
12+
System.out.println("🟢 GO! The light is GREEN.");
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.flow;
2+
3+
record RedLight() implements TrafficLightState {
4+
5+
@Override
6+
public void change(TrafficLight trafficLight) {
7+
trafficLight.setState(new GreenLight());
8+
}
9+
10+
@Override
11+
public void display() {
12+
System.out.println("🔴 STOP! The light is RED.");
13+
}
14+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.flow;
2+
3+
class TrafficLight {
4+
5+
private TrafficLightState state;
6+
7+
TrafficLight() {
8+
this.state = new RedLight();
9+
}
10+
11+
void setState(TrafficLightState state) {
12+
this.state = state;
13+
}
14+
15+
void change() {
16+
state.change(this);
17+
}
18+
19+
void display() {
20+
state.display();
21+
}
22+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.flow;
2+
3+
sealed interface TrafficLightState permits RedLight, YellowLight, GreenLight {
4+
5+
void change(TrafficLight trafficLight);
6+
7+
void display();
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.flow;
2+
3+
record YellowLight() implements TrafficLightState {
4+
5+
@Override
6+
public void change(TrafficLight trafficLight) {
7+
trafficLight.setState(new RedLight());
8+
}
9+
10+
@Override
11+
public void display() {
12+
System.out.println("🟡 Caution! The light is YELLOW.");
13+
}
14+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.machine;
2+
3+
public class MediaPlayer {
4+
5+
private MediaPlayerState state;
6+
7+
public MediaPlayer() {
8+
this.state = new StoppedState();
9+
}
10+
11+
public void setState(MediaPlayerState state) {
12+
this.state = state;
13+
}
14+
15+
public void pressPlay() {
16+
state.pressPlay(this);
17+
}
18+
19+
public void pressPause() {
20+
state.pressPause(this);
21+
}
22+
23+
public void pressStop() {
24+
state.pressStop(this);
25+
}
26+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.machine;
2+
3+
sealed interface MediaPlayerState permits PausedState, PlayingState, StoppedState {
4+
5+
void pressPlay(MediaPlayer player);
6+
7+
void pressPause(MediaPlayer player);
8+
9+
void pressStop(MediaPlayer player);
10+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.machine;
2+
3+
record PausedState() implements MediaPlayerState {
4+
5+
@Override
6+
public void pressPlay(MediaPlayer player) {
7+
System.out.println("▶ Resuming music...");
8+
player.setState(new PlayingState());
9+
}
10+
11+
@Override
12+
public void pressPause(MediaPlayer player) {
13+
System.out.println("⏸ Already paused!");
14+
}
15+
16+
@Override
17+
public void pressStop(MediaPlayer player) {
18+
System.out.println("⏹ Stopping music...");
19+
player.setState(new StoppedState());
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package pl.mperor.lab.java.design.pattern.behavioral.state.machine;
2+
3+
record PlayingState() implements MediaPlayerState {
4+
5+
@Override
6+
public void pressPlay(MediaPlayer player) {
7+
System.out.println("▶ Already playing!");
8+
}
9+
10+
@Override
11+
public void pressPause(MediaPlayer player) {
12+
System.out.println("⏸ Pausing music...");
13+
player.setState(new PausedState());
14+
}
15+
16+
@Override
17+
public void pressStop(MediaPlayer player) {
18+
System.out.println("⏹ Stopping music...");
19+
player.setState(new StoppedState());
20+
}
21+
}

0 commit comments

Comments
 (0)