定义:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

题目:某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,且每次仅出售一包纸巾,状态图如下:

状态模式(State)-01_java

采用状态模式来实现该纸巾售卖机,其中类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别表示售出纸巾、纸巾售完、没有投币、有2元钱

import java.util.*;

interface State

{public void insertQuarter();    //投币

 public void ejectQuarter();     //退币

 public void turnCrank();     //按下“出纸巾”按钮

 public void dispense();      //出纸巾

}

class TissueMachine

{ State soldOutState,noQuarterState,hasQuarterState,soldState,state;    
                       //默认修饰符:在同一个包中的其他类中访问

  state=soldOutState;   
       //初始化,使state保持有效状态对象,有助于管理机器初始行为和后续转换

  int count=0;    //纸巾数

public TissueMachine(int numbers){/实现代码省略/}

public State getHasQuarterState(){return hasQuarterState;}

public State getNoQuarterState(){return noQuarterState;}

public State getSoldState(){return soldState;}

public State getSoldOutState(){return soldOutState;}

public int getCount(){return count;}

//其余代码省略

}

class NoQuarterState implements State

{TissueMachine tissueMachine;

 public void insertQuarter(){

 tissueMachine.setState(tissueMachine.getHasQuarterState);    

}                            //set方法被省略了,方法可以作为参数调用

//构造方法及其余代码省略

}

class HasQuarterState implements State

{

  TissueMachine tissueMachine;

  public void ejectQuarter(){

  tissueMachine.setState(tissueMachine.NoQuarterState);   

}

//构造方法及其余代码省略

}

class SoldState implements State

{TissueMachine tissueMachine;

 public void dispense(){

 if (tissueMachine.getCount()>0)

	{ tissueMachine.setState(tissueMachine.getNoQuarterState);

	}                                         

	else {

    tissueMachine.setState(tissueMachine.getSoldOutState);

	}                                         

}
}