The State Pattern allows an object to alter its behavior when its internal state changes.  The object will appear to change its class.  With the State Pattern we have a set of behaviors encapsulated in state objects; at any time the context is delegating to one of those states.  Over time the current state changes across the set of objects to reflect the internal state of the context, so the context's behavior changes over time as well.  The client usually knows very little, if anything, about the state objects.

An example of the State Design Pattern follows:

public interface State {
    public abstract insertQuarter();
    public abstract ejectQuarter();
    public abstract turnCrank();
    public abstract dispense();
}
public class GumballMachine {
    State soldOutState;
    State noQuarterState;
    State hasQuarterState;
    State soldState;
	
    State state = soldOutState;
    int count = 0;
	
    public GumballMachine(int count) {
        soldOutState = new SoldOutState(this);
        ...
        this.count = count;
        if (count > 0) { state = noQuarterState; }
    }
	
    public void insertQuarter() { state.insertQuarter(); }
    public void ejectQuarter() { state.ejectQuarter(); }
    public void turnCrank() { state.turnCrank(); state.dispense(); }
    public void setState(State state) { this.state = state; }
    public void releaseBall() {
        System.out.println("A gumball comes rolling out");
        if (count != 0 { count--; }
    }
    public State getSoldOutState() {
        return soldOutState;
    }
}

public class HasQuarterState implements State {
    GumballMachine gumballMachine;
	
    public HasQuarterState(GumballMachine machine) {
        gumballMachine = machine;
    }
	
    public void insertQuarter() {
        System.out.println("You can't insert another quarter.");
    }
	
    public void ejectQuarter() {
        System.out.println("Quarter returned.");
    }
	
    public void turnCrank() {
        System.out.println("You turned...");
        gumballMachine.setState(gumballMachine.getSoldState());
    }
	
    public void dispense() {
        System.out.println("No gumball dispensed");
    }
}

public class SoldState implements State {
    //  constructor and instance variables here
    public void insertQuarter() {
        System.out.println("Please wait, we're already giving you a gumball");
    }
    public void ejectQuarter() {
        System.out.println("Sorry, you already turned the crank.");
    }
    public void turnCrank() {
        System.out.println("Turning twice won't get you another gumball!");
    }
    public void dispense() {
        gumballMachine.releaseBall();
        if (gumballMachine.getCount() > 0) {
            gumballMachine.setState(gumballMachine.getNoQuarterState());
        } else {
            gumballMachine.setState(gumballMachine.getSoldOutState());
        }
    }
}