阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】某大型商场内安装了多个简易的纸巾售卖机,自动售出2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图17—7所示。

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