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

admin2014-11-13  27

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

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

【C++代码】
#include
USing namespace Std;
//以下为类的定义部分
Class TissueMachine;  //类的提前引用
C1ass State{
publ iC:
    virtual void insertQuar七er()=0;    //投币
    virtual void ejectQuarter()=0;    //退币
    virtual void turnCrank()=0;    //按下“出纸巾”按钮
    virtual void dispense()=0;   //出纸巾
);
/*类SoldOutState、NoQuarterState、HasQuarterState、SoldState的定义省略,
每个类中均定义了私有数据成员TissueMachine*tissueMachine*/
ClasS TiSsueMachine(
private:
1*soldOutState,*noQuarterState,*hasQuartersta七e,*soldState,*state;
    int count;  //纸巾数
publ ic:
    Ti S sueMachine(int  number);
    void setState(State*state);
    State* getHasQuarterState();
    State*getNoQuarterState();
    State*getSoidState();
    State*getS01dOurState();
    int getCount();
    //其余代码省略
    };
    //以下为类的实现部分
    void NoQuarterState::inserQuarter()(
    tissureMachine->setState(2) ;
    }
    void HasQuarterstate::ej ectQuarter(){
    tissureMachine->setState(3) ;
    }
    void SoldState::dispense()(
    i f(ti SsueMachine一>getCount()>0)(
    tissureMachine->setState(4);
    }
    e1Se{
    tissureMachine->setState(5);
    }
    }
//其余代码省略

选项

答案(1)State (2)tissueMachine->getHasQuarterState0或new HasQuarterState (3)tissueMachine->getNoQuarterState0或new NoQuarterState (4)tissueMachine->getNoQuarterState0或new NoQuarterState (5)tissueMachine->getS0ldoutState()或new So|dOutState

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

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