State Pattern Example

The state interface and two implementations. The state method has a reference to the context object and is able to change its state.

interface State { 
	public void writeName(StateContext stateContext, String name);
} 
 
class StateA implements State { 
	public void writeName(StateContext stateContext, String name) { 
		System.out.println(name.toLowerCase()); 
		stateContext.setState(new StateB()); 
	} 
} 
 
class StateB implements State { 
	private int count=0; 
	public void writeName(StateContext stateContext, String name){ 
		System.out.println(name.toUpperCase()); 
		if(++count>1) { 
			stateContext.setState(new StateA()); 
		}
	}
}


The context class has a state variable which it instantiates in an initial state, in this case StateA. In its method, it uses the corresponding methods of the state object.

public class StateContext {
	private State myState; 
	public StateContext() { 
		setState(new StateA()); 
	} 
 
        // normally only called by classes implementing the State interface
	public void setState(State newState) { 
		this.myState = newState; 
	}
 
	public void writeName(String name) { 
		this.myState.writeName(this, name); 
	} 
}


And the usage:

public class TestClientState { 
	public static void main(String[] args) { 
		StateContext sc = new StateContext(); 
		sc.writeName("Monday"); 
		sc.writeName("Tuesday"); 
		sc.writeName("Wednesday"); 
		sc.writeName("Thursday"); 
		sc.writeName("Saturday"); 
		sc.writeName("Sunday"); 
	}
}


According to the above code, the output of main() from TestClientState should be:

monday
TUESDAY
WEDNESDAY
thursday
SATURDAY
SUNDAY
Comments