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