Design-Patterns-For-Beginners
Design-Patterns-For-Beginners copied to clipboard
Modifing exumple
Please consider this modification to your example:
package com.in28minutes.patterns;
public class StatePattern {
static class FanWallControl {
private SpeedLevel current;
public FanWallControl() {
current = new Off();
}
public void set_state(SpeedLevel state) {
current = state;
System.out.println("Switching to: " + current.getClass().getSimpleName());
}
public void rotate() {
current.rotate(this);
}
@Override
public String toString() {
return String.format("FanWallControl [current=%s]", current);
}
}
interface SpeedLevel {
void rotate(FanWallControl fanWallControl);
}
static class Off implements SpeedLevel {
public void rotate(FanWallControl fanWallControl) {
fanWallControl.set_state(new SpeedLevel1());
}
}
static class SpeedLevel1 implements SpeedLevel {
public void rotate(FanWallControl fanWallControl) {
fanWallControl.set_state(new SpeedLevel2());
}
}
static class SpeedLevel2 implements SpeedLevel {
public void rotate(FanWallControl fanWallControl) {
fanWallControl.set_state(new SpeedLevel3());
}
}
static class SpeedLevel3 implements SpeedLevel {
public void rotate(FanWallControl fanWallControl) {
fanWallControl.set_state(new Off());
}
}
public static void main(String[] args) {
FanWallControl fanControl = new FanWallControl();
System.out.println("Current state: " + fanControl.current.getClass().getSimpleName());
fanControl.rotate();
System.out.println("Current state: " + fanControl.current.getClass().getSimpleName());
fanControl.rotate();
System.out.println("Current state: " + fanControl.current.getClass().getSimpleName());
fanControl.rotate();
System.out.println("Current state: " + fanControl.current.getClass().getSimpleName());
fanControl.rotate();
}
}