设计模式(状态模式)

 字面上理解:比如一个流程中存在多个状态,每个状态对应一个行为,一个流程下来就完成了一项任务;但是现在我要修改其中一个状态或者要增加一个状态,怎么设计呢?

                        采用策略模式(策略模式可以在程序运行时对象动态组合)?当然可以采用策略模式,最好的方法是采用状态模式了,因为状态模式是针对许多不同状态的对象,也                         就是说状态模式 的对象拥有 一组定义良好的状态转换,这也就是状态模式的应用场景了。


状态模式:封装基于状态的行为,并将行为委托到当前状态;

策略模式:将可以互换的行为封装起来,然后使用委托的方法,决定使用哪个行为;

  所谓封装,不过就是声明一个类了。


实例代码:


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);
	}
}


运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值