问题 问答题

阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。

【说明】某航空公司会员积分系统(CFrequentFlyer)的主要功能描述如下:乘客只要办理该航空公司的会员卡,即可成为普卡会员(CBasic)。随着飞行里程数的积累,可以从普卡会员升级到银卡会员(CSilver)或金卡会员(CGold)。非会员(CNonMember)不能累积里程数。

每年年末,系统根据会员在本年度累积的里程数对下一年会员等级进行调整。

普卡会员在一年内累积的里程数若满25,000英里但不足50,000英里,则自动升级为银卡会员;若累积的里程数在50,000英里以上,则自动升级为金卡会员。银卡会员在一年内累积的里程数若在50,000英里以上,则自动升级为金卡会员。

若一年内没有达到对应级别要求的里程数,则自动降低会员等级。金卡会员一年内累积的里程数若不足25,000英里,则自动降级为普卡会员;若累积的里程数达到25,000英里,但是不足50.000英里,则自动降级为银卡会员。银卡会员一年内累积的里程数若不足25,000英里,则自动降级为普卡会员。采用面向对象方法对会员积分系统进行分析与设计,得到如图3-1所示的状态图和图3-2所示的类图。

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

答案

参考答案:

问题1:S1:普卡、普卡会员S2:银卡、银卡会员S3:金卡、金卡会员T1:25000<_里程数<50000T2:里程数>=50000T3:里程数>=50000

问题2:C1:CnonMemberC2:CbasicC3:CsilverC4:Cgold(C1-C4的次序可以互换)

问题3:使用了State模式(状态模式)。类CFrequentFlyer必须具有的属性:CLevel的对象。travel方法的功能:计算飞行里程数,根据里程数判断是否需要调整会员级别(跳转到不同的状态)。

解析:

本题属于经典的考题,主要考查面向对象分析方法以及UML的状态图和类图的相关知识及应用。

【问题1】UML中的状态图主要用于描述一个对象在其生存期间的动态行为,表现一个对象所经历的装填序列,引起状态转移的事件以及因状态转移而伴随的动作。图中给出的是会员的状态图。图中要求填充S1、S2、S3这三个状态以及它们之间的变迁关系。本题中会员有三种状态:普卡、金卡和银卡。根据说明,办理会员卡之后即可成为普卡会员,所以S1可以判定为普卡会员。当"里程数满25,000英里但不足50,000英里,则自动升级为银卡会员",所以S2应为银卡会员,那么S3就应该是金卡会员。T1、T2就是S2和S3之间的转换原则。T3是S1->S2的转换原则。由说明可知,S2->S3(T2):里程数在50,000英里以上;S3->S3(T1):里程数达到25,000英里,但是不足50,000英里;S1->S3(T3):累积的里程数在50,000英里以上。

【问题2】由图3-2可知,需要补充的是继承结构中的子类。根据题目说明,能够具有一般/特殊关系的只有不同级别的会员。所以C1~C4依次应该是:CNonMember、CBasic、CSilver、CGold。

【问题3】本题在设计类时使用到了状态模式。状态模式允许对象在内部状态变化时,变更其行为,并且修改其类。状态模式的类图如下所示。

其中:

●环境类(Context):定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。

●抽象状态类(State):定义一个接口以封装与Context的一个特定状态相关的行为。

●具体状态类(ConcreteState):每一子类实现一个与Context的一个状态相关的行为。

图3-2中的类CFrequentFlyer对应上图中的环境类,因此类CFrequentFlyer应该有一个CLevel类的对象。travel方法的功能:计算飞行里程数,根据里程数判断是否需要调整会员级别(跳转到不同的状态)。

写作题
多项选择题