版权声明:转载请注明出处: https://blog.csdn.net/qq_21687635/article/details/84974031
模式定义
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
下图是该模式的类图:
一个生动的例子
就是一个自动售卖机,投硬币—>摇杆—>出东西。
一共有这么几个状态:无硬币状态、有硬币状态、无货状态和出货状态。
下面是代码:
状态接口:
public interface State {
// 投硬币
void insertQuarter();
// 退硬币
void ejectQuarter();
// 摇杆
void turnCrank();
// 取东西
void dispense();
}
无硬币的状态:
public class NoQuarterState implements State {
private GumballMachine gumballMachine;
public NoQuarterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("You inserted a quarter.");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}
@Override
public void ejectQuarter() {
System.out.println("You haven't inserted a quarter.");
}
@Override
public void turnCrank() {
System.out.println("You turned but there's no quarter.");
}
@Override
public void dispense() {
System.out.println("You need to pay first.");
}
}
有硬币的状态:
public class HasQuarterState implements State {
private GumballMachine gumballMachine;
public HasQuarterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("You can't insert another quarter.");
}
@Override
public void ejectQuarter() {
System.out.println("Quarter returned.");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
@Override
public void turnCrank() {
System.out.println("You turned...");
gumballMachine.setState(gumballMachine.getSoldState());
gumballMachine.dispense();
}
@Override
public void dispense() {
System.out.println("No gumballs dispensed.");
}
}
出货状态:
public class SoldState implements State {
private GumballMachine gumballMachine;
public SoldState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("Please wait, we're already giving you a gumball.");
}
@Override
public void ejectQuarter() {
System.out.println("Sorry, you already turned the crank.");
}
@Override
public void turnCrank() {
System.out.println("Turning twice doesn't get you another gumball!");
}
@Override
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 {
@Override
public void insertQuarter() {
System.out.println("You can't insert a quarter, the machine is sold out.");
}
@Override
public void ejectQuarter() {
System.out.println("You can't eject, you haven't inserted a quarter yet.");
}
@Override
public void turnCrank() {
System.out.println("You turned but there's no gumballs.");
}
@Override
public void dispense() {
System.out.println("No gumballs dispensed.");
}
}
售卖机:
public class GumballMachine {
private State soldOutState;
private State noQuarterState;
private State hasQuarterState;
private State soldState;
private State state = soldOutState;
private int count = 0;
public GumballMachine(int numberGumballs) {
soldOutState = new SoldOutState();
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();
}
public void dispense() {
state.dispense();
}
public void releaseBall() {
System.out.println("A gumball comes rolling out the slot...");
if (count != 0) {
count = count - 1;
}
}
public State getSoldOutState() {
return soldOutState;
}
public void setSoldOutState(State soldOutState) {
this.soldOutState = soldOutState;
}
public State getNoQuarterState() {
return noQuarterState;
}
public void setNoQuarterState(State noQuarterState) {
this.noQuarterState = noQuarterState;
}
public State getHasQuarterState() {
return hasQuarterState;
}
public void setHasQuarterState(State hasQuarterState) {
this.hasQuarterState = hasQuarterState;
}
public State getSoldState() {
return soldState;
}
public void setSoldState(State soldState) {
this.soldState = soldState;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public String toString() {
return "GumballMachine [state=" + state.getClass().getSimpleName() + ", count=" + count + "]";
}
}
参考
- Head First 设计模式[书籍]