状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
状态模式和策略模式很相似,只是意图不一样。状态模式有定义好的状态,并且随着代码的执行状态在改变。
先定义一个状态接口
public interface State {
void insertQuarter();
void ejectQuarter();
void trunCrank();
void dispense();
}
然后分别没一种状态下实现这些方法
public class HasQuarterState implements State{
GumballMachine gumballMachine;
public HasQuarterState(GumballMachine gumballMachine) {
super();
this.gumballMachine = gumballMachine;
}
public GumballMachine getGumballMachine() {
return gumballMachine;
}
public void setGumballMachine(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("You inserted a anotehr quarter");
}
@Override
public void ejectQuarter() {
System.out.println("Quarter returned");
gumballMachine.setState(gumballMachine.noQuarterState);
}
@Override
public void trunCrank() {
System.out.println("You truned");
gumballMachine.setState(gumballMachine.soldState);
}
@Override
public void dispense() {
System.out.println("no gumball dispensed");
}
}
public class NoQuarterState implements State{
GumballMachine gumballMachine;
public NoQuarterState(GumballMachine gumballMachine) {
super();
this.gumballMachine = gumballMachine;
}
public GumballMachine getGumballMachine() {
return gumballMachine;
}
public void setGumballMachine(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("You inserted a quarter");
gumballMachine.setState(gumballMachine.hasQuaterState);
}
@Override
public void ejectQuarter() {
System.out.println("You haven't inserted a quarter");
}
@Override
public void trunCrank() {
System.out.println("You haven't,but there's no quarter");
}
@Override
public void dispense() {
System.out.println("You need to play first");
}
}
public class SoldQuarterState implements State{
GumballMachine gumballMachine;
public SoldQuarterState(GumballMachine gumballMachine) {
super();
this.gumballMachine = gumballMachine;
}
public GumballMachine getGumballMachine() {
return gumballMachine;
}
public void setGumballMachine(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("Sold out");
}
@Override
public void ejectQuarter() {
System.out.println("Sold out");
}
@Override
public void trunCrank() {
System.out.println("Sold out");
}
@Override
public void dispense() {
System.out.println("Sold out");
}
}
应用类 在调用state子类方法时,state会被改变 ,这样在加一个状态时 只要和state相关的代码 不需要全部改变。
public class GumballMachine {
/* public final static int SOLD_OUT = 0;
public final static int NO_QUARTER = 1;
public final static int HAS_QUARTER = 2;
public static int SOLD = 3;*/
State soldOutState;
State noQuarterState;
State hasQuaterState;
State soldState;
State state = soldState;
int count = 0;
public GumballMachine(int numberGumballs) {
soldOutState = new SoldQuarterState(this);
noQuarterState = new NoQuarterState(this);
hasQuaterState = 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 trunCrank() {
state.trunCrank();
}
public void releaseBall() {
System.out.println("A gumball comes rolling out the solt...");
if(count != 0) {
count = count -1;
}
}
public static void main(String[] args) {
GumballMachine gumballMachine = new GumballMachine(5);
gumballMachine.insertQuarter();
gumballMachine.trunCrank();
gumballMachine.insertQuarter();
gumballMachine.trunCrank();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}