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

admin2018-07-25  31

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

    采用状态(State)模式来实现该纸巾售卖机,得到如图10.36所示的类图。其中类State为抽象类,定义了投币、退币、出纸巾等方法接口。类SoldState、SoldOutState、NoQuarterState和HasQuarterState分别对应图10.35中纸巾售卖机的4种状态:售出纸巾、纸巾售完、没有投币、有2元钱。

【C++代码】
#inClude<iostream>
using namespace std;
//以下为类的定义部分
class TissueMachine; //类的提前引用
C1ass State{
public:
    virtual void insertQuarter()=0;  //投币
    virtual void ejectQuarter()=0;  //退币
    virtual void turnCrank()=0;    //按下“出纸巾”按钮
    virtusl void dispense()=0;    //出纸巾
};
/*类SoidOutState、NoQuarterState、HasQuarterState、SoldState的定义省略,
每个类中均定义了私有数据成员TissueMachine*tissueMachine*/class TiSsueMachine{
private:
    ____(1)*soldOutState,*noQuarterState,*hasQuarterState,*soldstate,*state;
    int count;  //纸巾数
public:
    TissueMachine(int  number);
    void setState(State*state);
    State*  qetHasQuarterState();
    State*  qetNoQuarterState();
    State*  qetSoldState();
    State*  getSoldOutState();
    int getCount();
    //其余代码省略
  };
  //以下为类的实现部分
  void NoQuarterState::insertQuarter(){
  tissueMachine->setState____(2);
  }
  void HasQuarterstate::ejectQuarter()(
  tissueMachine->setState____(3);
    }
    void SoldState::dispense(){
    if(tissueMachine->getC0unt()>0){
    tissueMachine->setState____(4);
    }
    else{
    tissueMachine->setState____(5);
    }
    }
    //其余代码省略

选项

答案(1)State (2)tissueMachine->getHasQuarterState0或new HasQuarterState() (3)tissueMachine->getNoQuarterState0或new NoQuanerState() (4)tissueMachine->getNoQuarterState0或new NoQuarterState() (5)tissueMachine->getSoldoutState()或new SoldOutState()

解析 空(1):根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。State定义了纸巾售卖机所对应的一些状态,如售出纸巾、纸巾售完等。类SoldOutState、NoQuarterState、HasQuarterState、SoldState均由类State派生而来。
    空(2):void insertQuarter()定义了一个“投币”的方法,即在“没有投币”状态下,用户投币的方法。tissureMachine->setState是改变纸巾售卖机的状态,此时,用户已投入2元钱,故将此时的状态改为“有2元钱”的状态,纸巾售卖机调用“有2元钱”状态的方法即可。
    空(3):void ejectQuarter()定义了一个“退币”的方法,即在“有2元钱”状态下,用户按下退币按钮,纸巾售卖机将此时的状态改为“没有投币”状态,故直接调用getNoQuarterState()即可。
    空(4):根据纸巾售卖机状态图可知,当售出纸巾并且纸巾数量仍大于0时,将返回“没有投币”状态。同空(3)的分析,此处应调用getNoQuarterState()。
    空(5):根据纸巾售卖机状态图可知,当售出纸巾并且纸巾数量等于0时,将返回“纸巾售完”状态。此处用了if…else…判断语句,当纸巾数量仍大于0时,返回“没有投币”状态,否则,纸巾数量一定等于0。空(5)处是else下的一条语句,故此处是判断count为0时纸巾售卖机的状态,显然应调用getSoldOutState()。
转载请注明原文地址:https://jikaoti.com/ti/yFi7FFFM
0

相关试题推荐
最新回复(0)