问答题
阅读下列说明和Java代码,将应填入______处的字句写在下面。
[说明]
某大型商场内安装了多个简易的纸巾售卖机,自动售出2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图1所示。

图1 纸巾售卖机状态图
采用状态(State)模式来实现该纸巾售卖机,得到如图2所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuanerState分别对应图1中纸巾售卖机的4中状态:售出纸巾、纸巾售完、没有投币、有2元钱。
【正确答案】
【答案解析】State
tissueMachine.getHasQuarterState()或new HasQuarterState()或tissueMachine.HasQuarterState()
tissueMachine.getNoQuarterState()或new NoQuarterState()或tissueMachine.NoQuarterState()
tissueMachine.getNoQuarterState()或new NoQuarterState()或tissueMachine.NoQuarterState()
tissueMacbine.getSoldOutState()或new SoldOutState()或tissueMachine.SoldOutState()
[解析] 根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。State定义了纸巾售卖机所对应的一些状态,售出纸巾、纸巾售完等状态。类SoldOutState、NoQuarterState、HasQuarterState、SoldState均有类State派生而来。
public void insertQuarter()定义了一个“投币”的方法:在没有“2元钱”时,客户投币的方法。tissureMachine.setState是改变纸巾售卖机的状态,此时,客户已投入2元钱,故将此时的状态改为“有2元钱”的状态,纸巾售卖机调用“有2元钱”状态的方法即可。
public void ejectQuarter()定义了一个“退币”的方法:在有2元钱的状态下,用户按下“退币”按钮,纸巾售卖机将此时的状态改为“没有投币”状态,故直接调用NoQuarterState()即可。
根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量仍大于0时,将返回“没有投币”状态,此处应调用NoQuarterState()。
根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量等于0时,将返回“纸巾售完”状态,此处用了if…else判断语句,当纸巾数量仍大于0时,返回“没有投币”状态,否则,纸巾数量一定等于0,本段程序第五空是else下的一条语句,故此处是判断count为0时,纸巾售卖机的状态,显然,应调用SoldOutState。