状态模式类图如下:
实现我们的状态类
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 void ejectQuarter() {
System.out.println("You haven't inserted a quarter");
}
public void turnCrank() {
System.out.println("You turned,but there's no quarter");
}
public void dispense() {
System.out.println("You need to pay first");
}
}
完整的糖果机类
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=new NoQuarterState(this);
hasQuarterState=new HasQuarterState(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;
}
}
}
状态模式的使用
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);
}
}