5.某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态图如图6-1所示。
采用状态(State)模式来实现该纸巾售卖机,得到如图6-2所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别对应图6-1中纸巾售卖机的4种状态:售出纸巾、纸巾售完、没有投币、有2元钱。
【Java代码】
import java.util.*;
interface State{
public void insertQuarter( );//投币
public void ejectQuarter( );//退币
public void turnCrank( );//按下“出纸巾”按钮
public void dispense( );//出纸巾
}
class TissueMachine{
(1)soldOutState,noQuarterState,hasQuarterState,soldState,state;
state=soldOutState;
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((2));
}
//构造方法以及其余代码省略
}
class HasQuarterState implements State{
TissueMachine tissueMachine;
public void ejectQuarter( ){
tissueMachine.setState((3));
}
//构造方法以及其余代码省略
}
class SoldState implements State{
TissueMachine tissueMachine;
public void dispense( ){
if(tissueMachine.getCount( )>0){
tissueMachine.setState((4));
}else{
tissueMachine.setState((5));}
}
}