自我整理设计模式之状态模式(十)

一:状态模式
状态模式和策略模式非常的相像,策略模式在是围绕可以互换的算法,而状态是通过改变对象内部状态来帮助对象控制自己的行为。
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
二:设计原则
三:实例

package Test10_State;
/**
*糖果机 
根据不同的状态来进行操作
以下实列解释:投币十次 转动糖果机买糖果,
糖果机初始状态为 里面有5颗糖果,
当售完时 自动填充5颗
直到再次卖完
*/
public class GumballMachineTest {
 	public static void main(String[] args) {
  		GumballMachine gumballMachine = new GumballMachine(5);//初始 内有5颗糖果
  		
  		for(int i = 0 ;i<10 ;i++) {
  			//售完状态
   			if(gumballMachine.getState() == gumballMachine.getSoldOutState()) {
    				gumballMachine.refill(5);//自动填充5颗
   			}
   			gumballMachine.insertQuarter();
   			gumballMachine.turnCrank();
   			System.out.println();
  			}
 		}
}

首先要新建状态的接口

/**
* 糖果机 状态接口
* 内含 4种动作
*/
public interface State {
	//下面的操作 在不同状态下 应该进行不同的动作行为
	public void insertQuarter();//投币
	public void ejectQuarter();//退币
	public void turnCrank();//转动曲柄
	public void dispense();//发放糖果
}
//下面新建 5种具体的状态
/**
*销售就绪状态
*/
public class SoldState implements State {

	GumballMachine gumballMachine;
	public SoldState(GumballMachine gumballMachine) {
  		// TODO Auto-generated constructor stub
  		this.gumballMachine = gumballMachine;
 	}
        
        @Override
 	public void insertQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("请等待,我们已经准备了糖果");
 	}
	@Override
 	public void ejectQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("请等待,我们已经准备了糖果,无法退回");
 	}
 	@Override
 	public void turnCrank() {
  		// TODO Auto-generated method stub
  		System.out.println("请等待,我们已经准备了糖果,不用在转手柄了");
 	}
 	@Override
 	public void dispense() {
  		// TODO Auto-generated method stub
  		gumballMachine.releaseBall();
  		if(gumballMachine.getCount() > 0 ) {
   		
   			gumballMachine.setState(gumballMachine.getNoQuarterState());
  		
  		}else {
   			System.out.println("售罄");
   			gumballMachine.setState(gumballMachine.getSoldOutState());
  		}
 	}
}

/**
 * 售空的状态
 */
public class SoldOutState implements State {
 	GumballMachine gumballMachine;
 	public SoldOutState(GumballMachine gumballMachine) {
  		// TODO Auto-generated constructor stub
  		this.gumballMachine = gumballMachine;
 	}
 	@Override
	public void insertQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("已售罄,不要再投币了");
 	}
 	@Override
 	public void ejectQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("已售罄,未投币不退回");
 	}
 	@Override
 	public void turnCrank() {
  		// TODO Auto-generated method stub
  		System.out.println("已售罄,别再转手柄");
 	}
 	@Override
 	public void dispense() {
  		// TODO Auto-generated method stub
  		System.out.println("已售罄,不能发放");
 	}
}




/**
 * 未投币的状态
 *
 */
public class NoQuarterState implements State {
 	GumballMachine gumballMachine;
 	public NoQuarterState(GumballMachine gumballMachine) {
  		// TODO Auto-generated constructor stub
  		this.gumballMachine = gumballMachine;
 	}
 	@Override
 	public void insertQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("投入25美分");
  		//状态 从未投币 转换成 已投币
  		gumballMachine.setState(gumballMachine.getHasQuarterState());
 	}
 	@Override
 	public void ejectQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("退回25美分");
 	}
 	@Override
 	public void turnCrank() {
  		// TODO Auto-generated method stub
 		System.out.println("转动手柄,对不起,没有投币");
 	}
 	@Override
 	public void dispense() {
  		// TODO Auto-generated method stub
  		System.out.println("无法发放糖果,您需要先投币");
 	}
}




/**
 * 投币的状态
 *
 */
public class HasQuarterState implements State {
 	Random randomWinner = new Random();
 	GumballMachine gumballMachine;
 	public HasQuarterState(GumballMachine gumballMachine) {
  		// TODO Auto-generated constructor stub
  		this.gumballMachine = gumballMachine;
 	}
 	@Override
 	public void insertQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("已经投币了,不用再投");
 	}
 	@Override
 	public void ejectQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("退币");
  		gumballMachine.setState(gumballMachine.getNoQuarterState());
 	}
 	@Override
 	public void turnCrank() {
  		// TODO Auto-generated method stub
  		System.out.println("转动手柄");
  		int win = randomWinner.nextInt(10);//随机数
  		if((win == 0 ) && (gumballMachine.getCount() > 1) ) {
   			gumballMachine.setState(gumballMachine.getWinnerState());
  		}else {
   			gumballMachine.setState(gumballMachine.getSoldState());
  		}
 	}
 	@Override
 	public void dispense() {
  		// TODO Auto-generated method stub
  		System.out.println("糖果机不发糖");
 	}
}




/**
 * 赢家 幸运 状态
 *
 */
public class WinnerState implements State {
 	GumballMachine gumballMachine;
 	public WinnerState(GumballMachine gumballMachine) {
  		// TODO Auto-generated constructor stub
  		this.gumballMachine = gumballMachine;
 	}
 	@Override
 	public void insertQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("已经存在,不要重复投币");
 	}
 	@Override
 	public void ejectQuarter() {
  		// TODO Auto-generated method stub
  		System.out.println("请等待,我们已经准备了糖果,无法退回");
 	}
 	@Override
 	public void turnCrank() {
  		// TODO Auto-generated method stub
  		System.out.println("请等待,我们已经准备了糖果,不用在转手柄了");
 	}
 	@Override
 	public void dispense() {
  		// TODO Auto-generated method stub
  		System.out.println("你是幸运儿,将得到两份糖果");
  		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("已售罄");
    			gumballMachine.setState(gumballMachine.getSoldOutState());
   		}
  	}
 }
}

糖果机的实列

/**
 *糖果机
 */
public class GumballMachine {
 	//五种状态
 	State soldState;
 	State soldOutState;
 	State noQuarterState;
 	State hasQuarterState;
 	State winnerState;
 	
 	//初始状态
 	State state = soldOutState;
 	int count = 0;
 	
 	public GumballMachine(int numberGumballs) {
  		// TODO Auto-generated constructor stub
  		soldOutState = new SoldOutState(this);
  		soldState = new SoldState(this);
  		noQuarterState = new NoQuarterState(this);
  		hasQuarterState = new HasQuarterState(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();
 	}
 	public void refill(int count) {
  		System.out.println("------补充库存------");
  		System.out.println();
  		this.count = count;
  		state = noQuarterState;
 	}
 	void setState(State state) {
  		this.state = state;
 	}
 	void releaseBall() {
  		System.out.println("一个糖果正在售出");
  		if(count != 0) {
   			count = count-1;
  		}
 	}
 	
 public State getSoldState() {
  return soldState;
 }
 public State getSoldOutState() {
  return soldOutState;
 }
 public State getNoQuarterState() {
  return noQuarterState;
 }
 public State getHasQuarterState() {
  return hasQuarterState;
 }
 public State getWinnerState() {
  return winnerState;
 }
 public State getState() {
  return state;
 }
 public int getCount() {
  return count;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值