State

Allow object to change behavior when state changes

Overview

The State pattern allows an object to alter its behavior when its internal state changes. It appears as if the object changed its class. This pattern extracts state-specific behavior into different classes.

Key Concepts

State Interface: Declares state-specific methods

Concrete States: Implement distinct behaviors

Context: Maintains an instance of a ConcreteState and delegates work to it

Code Example

java
1public interface VendingMachineState {
2    void insertCoin();
3    void dispenseItem();
4}
5
6public class VendingMachine {
7    private VendingMachineState noCoinState;
8    private VendingMachineState hasCoinState;
9    private VendingMachineState currentState;
10    
11    public VendingMachine() {
12        noCoinState = new NoCoinState(this);
13        hasCoinState = new HasCoinState(this);
14        currentState = noCoinState;
15    }
16    
17    public void setState(VendingMachineState state) { this.currentState = state; }
18    public VendingMachineState getHasCoinState() { return hasCoinState; }
19    public VendingMachineState getNoCoinState() { return noCoinState; }
20    
21    public void insertCoin() { currentState.insertCoin(); }
22    public void dispenseItem() { currentState.dispenseItem(); }
23}
24
25public class NoCoinState implements VendingMachineState {
26    private VendingMachine machine;
27    public NoCoinState(VendingMachine machine) { this.machine = machine; }
28    
29    @Override public void insertCoin() {
30        System.out.println("Coin inserted.");
31        machine.setState(machine.getHasCoinState());
32    }
33    @Override public void dispenseItem() {
34        System.out.println("Insert coin first.");
35    }
36}
37
38public class HasCoinState implements VendingMachineState {
39    private VendingMachine machine;
40    public HasCoinState(VendingMachine machine) { this.machine = machine; }
41    
42    @Override public void insertCoin() {
43        System.out.println("Coin already inserted.");
44    }
45    @Override public void dispenseItem() {
46        System.out.println("Item dispensed.");
47        machine.setState(machine.getNoCoinState());
48    }
49}

AI Tutor

Ask about the topic

Sign in Required

Please sign in to use the AI tutor

Sign In
State - Behavioral Patterns | LLD | Revise Algo