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