定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
用自己的话说:把每个状态的具体行为封装的具体的某个类中,让状态类代替主体是实现一些操作。
代码:
定义一个状态接口类
public interface State {
//插入硬币
void insertQuarter();
//退出硬币
void ejectQuarter();
//扭动按钮
void tumCrank();
//发放糖果
void dispense();
String toString();
}
定义第一个状态,已投币状态
public class HasQuarterState implements State {
Random randomWinner = new Random(System.currentTimeMillis());
GumballMachine gumballMachine;//内置一个当前糖果机,用于对状态进行切换
/**
*
*/
public HasQuarterState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}
/* (非 Javadoc)
* @see com.jjt.state.State#insertQuarter()
*/
@Override
public void insertQuarter() {
System.out.println("不好意思,已经有人投了钱");
}
/* (非 Javadoc)
* @see com.jjt.state.State#ejectQuarter()
*/
@Override
public void ejectQuarter() {
System.out.println("退给您25分");
this.gumballMachine.setState(this.gumballMachine.getNoQuarterState());
}
/* (非 Javadoc)
* @see com.jjt.state.State#tumCrank()
*/
@Override
public void tumCrank() {
System.out.println("扭动按钮");
//表示有一定的几率会中大奖,会弹出两个小球
int winner = randomWinner.nextInt(10);
if((winner==0)&&gumballMachine.getGumCount()>1){
gumballMachine.setState(this.gumballMachine.getWinnerState());
}else{
this.gumballMachine.setState(gumballMachine.getSoldState());
}
}
/* (非 Javadoc)
* @see com.jjt.state.State#dispense()
*/
@Override
public void dispense() {
System.out.println("请先扭动按钮");
}
@Override
public String toString() {
return "投币状态";
}
}
定义第二个状态,未投币状态
public class NoQuartState implements State {
GumballMachine gumballMachine;
/**
*
*/
public NoQuartState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}
/* (非 Javadoc)
* @see com.jjt.state.State#insertQuarter()
*/
@Override
public void insertQuarter() {
System.out.println("您投入了25分元");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}
/* (非 Javadoc)
* @see com.jjt.state.State#ejectQuarter()
*/
@Override
public void ejectQuarter() {
System.out.println("您还没给钱,不能请求退钱");
}
/* (非 Javadoc)
* @see com.jjt.state.State#tumCrank()
*/
@Override
public void tumCrank() {
System.out.println("您还没给钱,不能扭动机器");
}
/* (非 Javadoc)
* @see com.jjt.state.State#dispense()
*/
@Override
public void dispense() {
System.out.println("您没给钱不能发放糖果");
}
@Override
public String toString() {
return "没有投币状态";
}
}
定义第三个状态,售罄状态
public class SoldOutState implements State {
GumballMachine gumballMachine;
/**
*
*/
public SoldOutState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
/* (非 Javadoc)
* @see com.jjt.state.State#insertQuarter()
*/
@Override
public void insertQuarter() {
System.out.println("无法投币,销磬");
}
/* (非 Javadoc)
* @see com.jjt.state.State#ejectQuarter()
*/
@Override
public void ejectQuarter() {
System.out.println("无法退钱,销磬");
}
/* (非 Javadoc)
* @see com.jjt.state.State#tumCrank()
*/
@Override
public void tumCrank() {
System.out.println("无法转动,销磬");
}
/* (非 Javadoc)
* @see com.jjt.state.State#dispense()
*/
@Override
public void dispense() {
System.out.println("无法发放糖果,销磬");
}
@Override
public String toString() {
return "售罄状态";
}
}
定义第四个状态,销售状态
public class SoldState implements State {
GumballMachine gumballMachine;
/**
*
*/
public SoldState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
/* (非 Javadoc)
* @see com.jjt.state.State#insertQuarter()
*/
@Override
public void insertQuarter() {
System.out.println("别人已经插入币");
}
/* (非 Javadoc)
* @see com.jjt.state.State#ejectQuarter()
*/
@Override
public void ejectQuarter() {
System.out.println("已经转动,无法退款");
}
/* (非 Javadoc)
* @see com.jjt.state.State#tumCrank()
*/
@Override
public void tumCrank() {
System.out.println("已经转动");
}
/* (非 Javadoc)
* @see com.jjt.state.State#dispense()
*/
@Override
public void dispense() {
gumballMachine.releaseBall();
if(this.gumballMachine.getGumCount()>0){
this.gumballMachine.setState(gumballMachine.getNoQuarterState());
}else{
System.out.println("糖果销售完了哟");
this.gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
@Override
public String toString() {
return "销售中状态";
}
}
定义第五个状态,幸运者状态,该状态时会弹出两个小球
public class WinnerState implements State {
GumballMachine gumballMachine;
/**
*
*/
public WinnerState(GumballMachine gumballMachine) {
this.gumballMachine=gumballMachine;
}
/* (非 Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "幸运者状态";
}
/* (非 Javadoc)
* @see com.jjt.state.State#insertQuarter()
*/
@Override
public void insertQuarter() {
System.out.println("幸运者状态,无法插入");
}
/* (非 Javadoc)
* @see com.jjt.state.State#ejectQuarter()
*/
@Override
public void ejectQuarter() {
System.out.println("幸运者状态,无法退币");
}
/* (非 Javadoc)
* @see com.jjt.state.State#tumCrank()
*/
@Override
public void tumCrank() {
System.out.println("幸运者状态,无法退钱");
}
/* (非 Javadoc)
* @see com.jjt.state.State#dispense()
*/
@Override
public void dispense() {
System.out.println("恭喜你,进入幸运者状态,要弹出两个糖果");
gumballMachine.releaseBall();
if(gumballMachine.getGumCount()==0){
gumballMachine.setState(gumballMachine.getSoldOutState());
}else{
gumballMachine.releaseBall();
if(gumballMachine.getGumCount()>0)
gumballMachine.setState(gumballMachine.getNoQuarterState());
else
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}
定义一个糖果机
public class GumballMachine {
State winnerState;
State soldOutState;
State noQuarterState;
State hasQuarterState;
State soldState;
State state = soldOutState;
int gumCount = 0;
/**
*
*/
public GumballMachine(int numberGumballs) {
soldOutState = new SoldOutState(this);
noQuarterState= new NoQuartState(this);
hasQuarterState = new HasQuarterState(this);
winnerState = new WinnerState(this);
soldState = new SoldState(this);
this.gumCount = numberGumballs;
if(numberGumballs>0)
state = noQuarterState;
}
public State getWinnerState() {
return winnerState;
}
public void setWinnerState(State winnerState) {
this.winnerState = winnerState;
}
//使用时,调用状态里面的方法进行调用
public void insertQuarter(){
state.insertQuarter();
}
public void ejectQuarter(){
state.ejectQuarter();
}
public void turnCrank(){
state.tumCrank();
state.dispense();
}
void releaseBall(){
if(gumCount!=0){
gumCount = gumCount -1;
System.out.println("弹出一个糖果");
}
}
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 int getGumCount() {
return gumCount;
}
public void setGumCount(int gumCount) {
this.gumCount = gumCount;
}
public State getState() {
return state;
}
void setState(State state) {
System.out.println("--");
System.out.println("更换状态"+state.toString());
System.out.println("--");
this.state = state;
}
测试:
public static void main(String[] args){
GumballMachine gumballMachine =new GumballMachine(25);
gumballMachine.insertQuarter();
gumballMachine.ejectQuarter();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
for(int i = 0 ;i<25;i++){
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
}
}
您投入了25分元
--
更换状态投币状态
--
退给您25分
--
更换状态没有投币状态
--
您投入了25分元
--
更换状态投币状态
--
扭动按钮
--
更换状态销售中状态
--
弹出一个糖果
--
更换状态没有投币状态
....