字面上理解:比如一个流程中存在多个状态,每个状态对应一个行为,一个流程下来就完成了一项任务;但是现在我要修改其中一个状态或者要增加一个状态,怎么设计呢?
采用策略模式(策略模式可以在程序运行时对象动态组合)?当然可以采用策略模式,最好的方法是采用状态模式了,因为状态模式是针对许多不同状态的对象,也 就是说状态模式 的对象拥有 一组定义良好的状态转换,这也就是状态模式的应用场景了。
状态模式:封装基于状态的行为,并将行为委托到当前状态;
策略模式:将可以互换的行为封装起来,然后使用委托的方法,决定使用哪个行为;
所谓封装,不过就是声明一个类了。
实例代码:
State.java
public interface State{
public void insertQuarter();
public void ejectQuarter();
public void turnCrank();
public void dispense();
}
soldOutState.java
public class soldOutState implements State{
GumballMachine gumballMachine;
public soldOutState(GumballMachine gumballMachine){
this.gumballMachine = gumballMachine;
}
public void insertQuarter(){
System.out.println("sorry ,alread sold out");
}
public void ejectQuarter(){
System.out.println("sorry,you can't operation it");
}
public void turnCrank(){
System.out.println("sorry,you can't operation it");
}
public void dispense(){
System.out.println("No gumball dispense,you can't operation it");
}
}
GumballMachine.java
public class GumballMachine{
State soldOutState;
State noQuarterState;
State hasQuarterState;
State soldState;
State winnerState;
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);
winnerState = new winnerState(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 (this.count!=0){
this.count = this.count -1;
}
}
public State getHasQuarterState(){
return this.hasQuarterState;
}
public State getNoQuarterState(){
return this.noQuarterState;
}
public State getSoldState(){
return this.soldState;
}
public State getSoldOutState(){
return this.soldOutState;
}
public State getWinnerState(){
return this.winnerState;
}
public int getCount(){
return this.count;
}
}
hasQuarterState.java
import java.util.Random;
public class hasQuarterState implements State{
GumballMachine gumballMachine;
Random randomWinner = new Random(System.currentTimeMillis());
public hasQuarterState(GumballMachine gumballMachine){
this.gumballMachine = gumballMachine;
}
public void insertQuarter(){
System.out.println("You can't inserted another quarter");
}
public void ejectQuarter(){
System.out.println("quarter returned");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
public void turnCrank(){
System.out.println("you turned ... ");
int winner = randomWinner.nextInt(10);
if((winner == 0) && (gumballMachine.getCount()>1)){
gumballMachine.setState(gumballMachine.getWinnerState());
}else{
gumballMachine.setState(gumballMachine.getSoldState());
}
}
public void dispense(){
System.out.println("No gumball dispensed");
}
}
noQuarterState.java
public class noQuarterState implements State{
GumballMachine gumballMachine;
public noQuarterState(GumballMachine gumballMachine){
this.gumballMachine = gumballMachine;
}
public void insertQuarter(){
System.out.println("You inserted 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");
}
}
winnerState.java
public class winnerState implements State{
GumballMachine gumballMachine;
public winnerState(GumballMachine gumballMachine){
this.gumballMachine = gumballMachine;
}
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 doesn't get you another gumball");
}
public void dispense(){
System.out.println("you are a winner!you get two gumballs for your quarter");
gumballMachine.releaseBall();
if(gumballMachine.getCount()==0){
gumballMachine.setState(gumballMachine.getSoldOutState());
}else{
gumballMachine.releaseBall();
if(gumballMachine.getCount()>0){
gumballMachine.setState(gumballMachine.getNoQuarterState());
}else{
System.out.println("Oops ,out of gumballs");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}
}
soldState.java
public class soldState implements State{
GumballMachine gumballMachine;
public soldState(GumballMachine gumballMachine){
this.gumballMachine = gumballMachine;
}
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 doesn't get you another gumball");
}
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());
}
}
}
GumballMachineTestDrive.java
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);
}
}