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}