Java
The state interface and two implementations. The state's method has a reference to the context object and is able to change its state.
interface Statelike { /** * Writer method for the state name. * @param STATE_CONTEXT * @param NAME */ void writeName(final StateContext STATE_CONTEXT, final String NAME); } class StateA implements Statelike { /* (non-Javadoc) * @see state.Statelike#writeName(state.StateContext, java.lang.String) */ @Override public void writeName(final StateContext STATE_CONTEXT, final String NAME) { System.out.println(NAME.toLowerCase); STATE_CONTEXT.setState(new StateB); } } class StateB implements Statelike { /** State counter */ private int count = 0; /* (non-Javadoc) * @see state.Statelike#writeName(state.StateContext, java.lang.String) */ @Override public void writeName(final StateContext STATE_CONTEXT, final String NAME) { System.out.println(NAME.toUpperCase); // Change state after StateB's writeName gets invoked twice if(++count > 1) { STATE_CONTEXT.setState(new StateA); } } }The context class has a state variable that it instantiates in an initial state, in this case StateA. In its method, it uses the corresponding methods of the state object.
The test below shows also the usage:
public class TestClientState { public static void main(String args) { final StateContext SC = new StateContext; SC.writeName("Monday"); SC.writeName("Tuesday"); SC.writeName("Wednesday"); SC.writeName("Thursday"); SC.writeName("Friday"); SC.writeName("Saturday"); SC.writeName("Sunday"); } }According to the above code, the output of main from TestClientState should be:
monday TUESDAY WEDNESDAY thursday FRIDAY SATURDAY sundayRead more about this topic: State Pattern, Example