State Design Pattern in Java

State lets an object change its behavior when its internal state changes. Each state is its own class.

Real life example

A traffic light: red, green and yellow behave differently and follow each other in order.

When to use

An object has many states and big if-else or switch blocks are making the code hard to read.

Complete Java example

Save this as Main.java, then run javac Main.java and java Main.

public class Main {
    public static void main(String[] args) {
        TrafficLight light = new TrafficLight();
        System.out.println(light.state.color());           // RED
        light.change();
        System.out.println(light.state.color());           // GREEN
    }
}

interface State {
    void next(TrafficLight light);
    String color();
}
class Red    implements State { public void next(TrafficLight l) { l.state = new Green();  } public String color() { return "RED"; } }
class Green  implements State { public void next(TrafficLight l) { l.state = new Yellow(); } public String color() { return "GREEN"; } }
class Yellow implements State { public void next(TrafficLight l) { l.state = new Red();    } public String color() { return "YELLOW"; } }

class TrafficLight {
    State state = new Red();
    void change() { state.next(this); }
}

Output

RED
GREEN