列表

详情


    阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
    某航空公司会员积分系统(CFrequentFlyer)的主要功能描述如下:     
    乘客只要办理该航空公司的会员卡,即可成为普卡会员(CBasic)。随着飞行里程数的积累,可以从普卡会员升级到银卡会员(CSilver)或金卡会员(CGold)。非会员(CNonMember)不能积累里程数。     
    每年年末,系统根据会员在本年度累积的里程数对下一年会员等级进行调整。     
    普卡会员在一年内累积的里程数若满25000英里但不足50000英里,则自动升级为银卡会员;若累积的里程数在50000英里以上,则自动升级为金卡会员。银卡会员在一年内累积的里程数若在50000英里以上,则自动升级为金卡会员。     
    若一年内没有达到对应级别要求的里程数,则自动降低会员等级。金卡会员一年内累积的里程数若不足25000英里,则自动降级为普卡会员;若累积的里程数达到25000英里,但是不足50000英里,则自动降级为银卡会员。银卡会员一年内累积的里程数若不足25000英里,则自动降级为普卡会员。     
    采用面向对象方法对会员积分系统进行分析与设计,得到如图3-1所示的状态图和图3-2所示的类图。

    

图3-1 状态图
    

图3-2的类图 

【问题1】(6分)
    根据说明中的描述,给出图3-1中S1~S3处所对应的状态以及T1~T3处所对应的迁移的名称。
【问题2】(4分)
    根据说明中的描述,给出图3-2中C1~C4所对应的类名(类名使用说明中给出的英文词汇)。
【问题3】(5分)
    图3-2所示的类图中使用了哪种设计模式?在这种设计模式下,类CFrequentFlyer必须具有的属性是什么?C1~C4中的travel方法应具有什么功能?

参考答案:

【问题1】(6分)

S1:普卡会员
S2:银卡会员 
S3:金卡会员
T1:25000<=里程<50000
T2:里程>=50000
T3:里程>=50000
【问题2】(4分)
C1 ~ C4:CNonMember、CBasic、CSilver、CGold
【问题3】(5分)
(1)状态模式           
(2)记录下一状态的属性       
(3)判断什么情况进入下一状态

详细解析:

【问题1】
系统中的状态图,是对状态转换的图形化表达。从题目的说明部分可知,在状态转换过程中,涉及到的状态一共有四种:非会员,普卡会员,银卡会员,金卡会员。从状态图涉及的转换可知S1~S3分别为:普卡会员,银卡会员,金卡会员。关于状态转换的分析如下:
(1)由于普卡会员在一年内若累积的里程数在50000英里以上,则自动升级为金卡会员,所以T3为:里程>=50000。
(2)由于银卡会员在一年内累积的里程数若在50000英里以上,则自动升级为金卡会员,所以T2为:里程>=50000。
(3)由于一年内没有达到对应级别要求的里程数,则自动降低会员等级。金卡会员一年累积的里程数达到25000英里,但是不足50000英里,则自动降级为银卡会员,所以T1为:25000<=里程<50000。
【问题2】
问题2非常容易,说明中给出的英文词汇一共只有5个,有着同属于一个父类的四个子类关系的,也就只有:CNonMember、CBasic、CSilver、CGold这四个了,并且这四个类位置可以互换。
【问题3】

该问题要求分析类图所采用的设计模式,此处由于涉及到状态的转换问题,所以首选应是设计模式中的状态模式。由于状态模式的标准UML图为:

与题目给出的图示完全一致,所以可以断定本题所采用的设计模式就是状态模式。
由于是状态模式,所以在类CFrequentFlyer中必须有属性能记录下一个状态,同时travel方法也需要能准确判断什么情况应该进入下一状态。

上一题