糖果机的状态:
public interface State
{
public void InsertQuarter();
public void ejectQuarter();
public void turnCrank();
public void dispense();
}
public class NoQuarterState implements State
{
GumballMachine gumballMachine;
public NoQuarterState (GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
public void insertQuarter()
{
System.out.println("You Insert a quarter");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}
}
public class HasQuarterState implements State
{
GumballMachine gumballMachine;
public HasQuarterState (GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
public void ejectQuarter()
{
System.out.println("Quarter returned");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
public void turnCrank()
{
System.out.println("You turned...");
gumballMachine.setState(gumballMachine.getSoldState());
}
}
public class SoldState implements State
{
GumballMachine gumballMachine;
public HasQuarterState (GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
public void dispense()
{
gumballMachine.releaseBall();
if(gumballMachine.getCount() > 0)
{
gumballMachine.setState(gumballMachine.getNoQuarterState());
}else
{
System.out.println("Oops,out of gumballs!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}
public class SoldOutState implements State
{
GumballMachine gumballMachine;
public HasQuarterState (GumballMachine gumballMachine)
{
this.gumballMachine = gumballMachine;
}
}
糖果机:
public class GumballMachine
{
State soldOutState;
State noQuarterState;
State hasQuarterState;
State soldState;
State state = soldOutState;
int count = 0;
public GumballMachine(int numberGumballs)
{
soldOutState = new SoldOutState(this);
noQuarterState= newNoQuarterState(this);
hasQuarterState= newHasQuarterState(this);
soldState= new SoldState(this);
this.count = numberGumballs;
if(numberGumballs > 0)
{
state = noQuarterState;
}
}
public void insertQuarter()
{
state.insertQuarter();
}
public void ejectQuarter()
{
state.ejectQuarter();
}
public void turnCrank()
{
state.turnCrank();
state.dispense();
}
void setState(State state)
{
this.state = state;
}
void releaseBall()
{
System.out.println("A gumball comes rolling out the slot...");
if(count != 0)
count = count - 1;
}
//这里有更多的方法,其中包括每一个状态的getter.....
}
向糖果机公司的CEO展示:
public class GumballMachineTestDrive
{
public static void main(String[] args)
{
GumballMachine gumballMachine = new GumballMachine(5);
System.out.println(gumballMachine);
gumballMachine.InsertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
gumballMachine.InsertQuarter();
gumballMachine.turnCrank();
gumballMachine.InsertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
}
}