image

编辑人: 浅唱

calendar2025-06-15

message2

visits181

2020年11月软件设计师下午题答案及解析

一、[材料型]问答题

案例一

某工厂制造企业为了开发软件智能检测以有效提升检测效率,节约人力资源,该系统的主要功能是:

(1)基础信息管理。管理员对检测标准和检测规则等基础信息设置。

(2)检测模型部署。管理员对常用机器学习方法建立的检测模型分布。

(3)图像采集。实时将检测多样的产品待检测建分存储,包括产品结构,生产时间,图像信号和产品图像。

(4)缺陷检测。根据检测模型和检测质量标准对图像采集所收到的产品检测信息中所有图像进行检测或所有图像检测合格。若一个产品出现一张图像检测不合格,就表示该产品不合格,对不合格产品,其检测结果包括,产品型号和不合格类型。

(5)质量检测。根据监控规则对产品质量进行监控将检测情况展示给检测业务员,若满足条件。向检测业务员发送质量检测,检测是质量发起远程控制部分,检测设备发送控制指令进行处理。

(6)模型监控。在系统中部署的模型、产品的检测信息结合基础信息进行监测分析,将模型运行情况发给监控人员。

现采用结构化方法对智能检测系统,进行分析与设计,获得如图1-1的上下文数据流图和图1-2的数据流图。

1、【问1】使用说明中的语句对图1-1中的实体E1~E4的名称

参考答案:

E1:检测设备E2:管理员E3:检测业务员E4:监控人员


解析:

根据提供的案例描述和图1-1的上下文数据流图,可以分析出图中各个实体所代表的名称。

E1在图中表示与检测设备相关的模块或组件,因为智能检测系统中需要实时采集产品的检测信息,包括图像采集等,所以E1应该是与检测设备交互的部分。

E2在系统中担任管理员角色,负责基础信息管理、检测模型部署等任务,根据案例描述中的“管理员”可以确定E2的名称。

E3根据描述中的“向检测业务员发送质量检测”可以确定为质量检测业务员,负责接收质量检测指令并进行相应的操作。

E4根据描述中的“模型监控人员将模型运行情况发给监控人员”可以确定,负责监控系统中部署的模型运行情况,因此E4是模型监控人员。

2、【问2】使用说明中的语句对图1-2中的数据存储D1~D3的名称

参考答案:

D1∶模型文件;D2∶产品检测信息文件;D3∶基础信息文件


解析:

根据题目描述和图1-2的数据流图,可以得知:

  • D1存储的是模型文件,对应检测模型部署的功能,包含管理员对常用机器学习方法建立的检测模型的分布。
  • D2存储的是产品检测信息文件,包含实时采集的产品待检测信息,如产品结构、生产时间、图像信号和产品图像等,以及检测结果,如产品型号和不合格类型。
  • D3存储的是基础信息文件,对应基础信息管理的功能,包含管理员设置的检测标准和检测规则等基础信息。

因此,使用说明中的语句对应图1-2中的数据存储D1~D3的名称分别为模型文件、产品检测信息文件和基础信息文件。

3、【问3】根据注明和图中术语,补齐图1-2中缺失的数据及起点和终点。

参考答案:

数据流:基础信息            起点D3     终点P6

数据流:远程控制命令     起点E3      终点P5

数据流:监控规则            起点D3     终点P5
数据流:待测信息            起点P2     终点P3
数据流:检测信息            起点D2     终点P5


解析:

本题要求根据提供的案例和已有的数据流图,补全缺失的数据及起点和终点。解答此类问题,首先需要理解案例中所描述的系统功能及其数据流情况,然后结合已有的数据流图进行分析。

案例中描述了智能检测系统的主要功能,包括基础信息管理、检测模型部署、图像采集、缺陷检测、质量检测和模型监控。这些功能在数据流图中应有相应的处理过程和数据流。

根据提供的参考答案,可以确认以下几点:

  • 基础信息的数据流起点为D3,终点为P6或与基础信息管理相关的处理过程。
  • 远程控制命令的数据流起点为E3,终点为与质量检测相关的处理过程P5。
  • 监控规则的数据流起点为D3,终点可能是与质量检测或模型监控相关的处理过程P5。
  • 待测信息的数据流起点为P2(采集到的图像信息),终点为检测模型或检测处理过程P3。
  • 检测信息的数据流起点为与检测相关的处理过程D2,终点可能是质量检测或模型监控的相关处理过程P5。

在补全数据流图时,还需要注意箭头的指向表示数据的流向,每个处理过程应有明确的输入输出,以确保系统的数据流动畅通。最后,补全后的数据流图应清晰展示系统中数据的来源、处理和去向。

4、【问4】根据说明,采用结构化语言对缺陷检测的加工逻辑进行描述。



参考答案:

根据说明,采用结构化语言对缺陷检测的加工逻辑进行描述。

WHILE(接收图像)

DO{

检测所收到的所有图像;

IF(出现一张图像检测不合格)

THEN{,返回产品不合格;

不合格产品检测结果=产品星号+不合格类型;

}

ENDIF

}ENDDO


解析:

结构化语言是一种描述系统加工逻辑的方式,常用于系统分析和设计。针对缺陷检测的加工逻辑,我们可以使用结构化语言进行如下描述:

  1. 系统首先初始化缺陷检测模块,为后续的图像检测做准备。
  2. 接收图像采集模块传递的产品图像信息,这是检测的基础数据。
  3. 对接收到的所有图像进行检测,这是缺陷检测的核心步骤。
  4. 在检测过程中,如果发现任何一张图像不合格,即判定该产品为不合格。
  5. 记录不合格产品的型号和不合格类型,生成详细的检测结果,以便于后续处理。
  6. 系统继续接收新的图像信息,并重复以上步骤,形成持续的检测过程。

参考提供的上下文中数据流图和缺陷检测相关的描述,结合结构化语言,对缺陷检测的加工逻辑进行了详细描述。

案例二

【注明】

M集团拥有多个分公司,为了方便集团公司对各个分公司职员进行有效管理,集团公司决定构建一个信息平台以满足公司各项业务管理需求

【需求分析】

1,分公司关系模式需要记录的信息包括公司编号、名称、经理号、可联系地址和电话。分公司编号唯一标记分公司关系模式中的没一个元组,每个分公司各有一名经理,负责分公司的管理工作,每个分公司设立仅为本分公司服务的多个业务部,业务部包括:研发部、财务部、采购部、交易部等

2,业务部关系模式需要记录的信息包括业务部的编号、名称、地址、电话和分公司编号、业务编号唯一标记分公司关系模式中的每一个元素,每个业务部各有一名主管负责业务部的管理工作,每个业务部有多名职员,每个职员只能来源与一个业务部

3,职员关系模式需要记录的信息包括职员号、姓名、所属业务部编号、岗位、电话、家庭成员姓名和成员关系。其中职员、      职员关系、岗位包括:经理、主管、研发员、业务员等。

【关系模式】

分公司(分公司编号、名称、 (a) 、联系地址)

业务部(业务部门编号、名称、(b)、电话)

职员(职员号、姓名、岗位、(c)、电话、家庭成员姓名、关系)

【概念模拟设计】

5、【问题一】根据问题描述,补充4个联系,完善图2-1的实体联系图,联系名可用联系1、-2、-3和-4代替,联系的类型为1:1、1:n和m:n(或1:1、1:*和*:*)

参考答案:【问题一】

解析:

根据题干描述,我们可以确定以下实体关系:

  1. 分公司需要有一名经理负责管理工作,这意味着分公司与经理的联系是唯一的,即一个分公司对应一个经理,因此联系类型为1:1。
  2. 每个分公司设立的业务部是专门为该公司服务的,因此分公司与业务部的联系是分公司有一个或多个业务部,即1:*(一对多的联系)。
  3. 每个业务部有多名职员,但每个职员只能来自一个业务部,所以业务部与职员的联系也是一对多的联系,即1:*。
  4. 每个业务部有一名主管负责管理工作,这意味着业务部与主管的联系是唯一的,即一个业务部对应一个主管,因此联系类型为1:1。

参照给出的参考答案的图片格式,我们可以按照这些实体关系绘制实体联系图并补充相应的联系。

6、【问题二】根据题意将以上关系模式中的空(a)~(c)的属性补充完整,并填入对应位置。

参考答案:

【问题二】

a、经理号、电话

b、地址、分公司编号

c、所属业务部编号

解析:

根据题目描述,我们可以得知:

对于分公司关系模式:

  • 分公司需要记录的信息包括公司编号、名称、经理号、可联系地址和电话。
  • 在关系模式中,分公司编号是唯一的,用于标记每一个分公司。
  • 每个分公司有一名经理,因此需要一个“经理号”来标识经理。
  • 另外,为了联系分公司,需要一个“电话”属性。

所以,空(a)的属性应该是“经理号”。

对于业务部关系模式:

  • 业务部需要记录的信息包括业务部的编号、名称、地址、电话和分公司编号。
  • 业务部编号是唯一的,用于标记每一个业务部。
  • 每个业务部都有一个地址和所属的分公司,因此需要有“地址”和“分公司编号”这两个属性。

所以,空(b)的属性应该是“地址”。

对于职员关系模式:

  • 职员需要记录的信息包括职员号、姓名、所属业务部编号、岗位、电话、家庭成员姓名和成员关系。
  • 职员与所属业务部有直接的关联,因此需要记录“所属业务部编号”来标识职员所属的业务部。

所以,空(c)的属性应该是“所属业务部编号”。

7、【问题三】(1)分析分公司关系模式的主建和外键

(2)分析业务部关系模式的主建和外键

参考答案:

【问题三】

(1)主键:分公司编号;外键:经理号

(2)主键:业务部的编号;外键:分公司编号

解析:

在分公司关系模式中,分公司编号是唯一的,可以唯一标记关系模式中的每一个元组,因此分公司编号是主键。经理号在分公司关系模式中是一个关键属性,用于关联到职员关系模式中的经理信息,因此是外键。

在业务部关系模式中,业务部编号是唯一的,可以唯一标记业务部关系模式中的每一个元素,因此业务部的编号是主键。分公司编号用于标识业务部所属的分公司,是关系模式中的一个关键属性,因此是外键。

8、【问题四】在职员关系模式中,假设每个职员有多名家属成员,那么职员关系模式存在什么问题?应如何解决?

参考答案:

【问题四】

存在问题:存在冗余、修改操作的不一致,以及插入异常和删除异常。

解决方案:将原关系模式分解为:

职员(职员号、姓名、岗位、所属业务部编号、电话)

职员家属(职员号、家庭成员姓名、关系)

解析:

在职员关系模式中,如果每个职员有多名家属成员,那么在一个元组中记录所有职员及其家属的信息会导致数据冗余。同时,当需要修改某个职员的信息或家属的信息时,可能会出现在多个元组中进行不一致的修改操作。此外,还会出现插入异常和删除异常的问题。

为了解决这个问题,可以将原关系模式分解为两个关系模式:一个是职员关系模式,记录职员的基本信息,如职员号、姓名、岗位、所属业务部编号、电话等;另一个是职员家属关系模式,记录职员家属的信息,如职员号、家庭成员姓名、关系等。通过职员号进行关联,这样既可以避免数据冗余,又可以保证数据的完整性。

案例三:

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

【说明】

    在线会议审稿系统(Online Reviewing System,ORS)主要处理会议前期的投稿和审稿事务,其功能描述如下:

    1.用户(User)在初始使用系统时,必须在系统中注册(register)成为作者(Author)或审稿人(Reviewer)。

    2.作者登录(login)后提交稿件(submit paper)和浏览稿件审阅结果(browse review results)。提交稿件必须在规定提交时间范围内,其过程为先输入标题和摘要(enter title and abstract)、选择稿件所属主题类型(select subject group )、选择稿件所在位置 (存储位置)(select paper location)。上述几步若未完成,则重复;若完成,则上传稿件至数据库中(upload paper ),系统发送通知(send notification )。

    3.审稿人登录后可设置兴趣领域(set preferences )、审阅稿件给出意见(enter review )以及罗列录用和(或)拒绝的稿件(List accepted/rejected papers)。

    4.会议委员会主席(PCChair)是一个特殊审稿人,可以浏览提交的稿件(browse     submitted papers)、给审稿人分配稿件(assign paper to reviewer )、罗列录用和(或)拒绝的稿件以及关闭审稿过程(close reviewing process)。其中,关闭审稿过程须包括罗列录用和(或)拒绝的稿件。

系统采用面向对象方法开发,使用UML进行建模。

  系统的部分用例图和提交稿件的活动图分别见下图。

9、【问题1】(4分)

    根据[说明]中的描述,使用参与者列表的英文名称,给出ORS用例图中A1~A4所对应的参与者。


参考答案:

A1:User、 A2:Author、A3:Reviewer、A4:PCChair。


解析:

根据说明中的描述,参与者列表的英文名称与ORS用例图中A1至A4的参与者对应关系如下:

  • A1对应的是User,表示系统的初始用户,需要进行注册等操作。
  • A2对应的是Author,表示注册后成为的作者,可以登录后提交稿件和浏览稿件审阅结果。
  • A3对应的是Reviewer,表示审稿人,登录后可以设置兴趣领域、审阅稿件给出意见等。
  • A4对应的是PCChair,即会议委员会主席,是特殊审稿人,具有浏览提交的稿件、给审稿人分配稿件、罗列录用和(或)拒绝的稿件以及关闭审稿过程的权限。

因此,ORS用例图中A1至A4所对应的参与者分别是User、Author、Reviewer和PCChair。

10、【问题2】(3分)

    根据[说明]中的描述,使用用例名称列表中的英文名称,给出ORS用例图中U1一 U3所对应的用例。


参考答案:

U1:list accepted/rejiected papers

U2:browse submitted papers

U3:assign paper to reviewer(U2、U3可互换)。


解析:

根据说明中的描述,U1对应的用例是罗列录用和/或拒绝的稿件,这是审稿人、会议委员会主席等角色在系统中的一项重要任务。U2的用例是浏览提交的稿件,这是会议委员会主席等需要浏览全部提交稿件的角色所使用的功能。U3的用例是给审稿人分配稿件,这是会议委员会主席在系统中管理审稿流程的一个重要步骤。因此,根据说明中的描述和系统功能,可以得出以上三个用例的英文名称。

11、【问题3】(4分)

    根据[说明]中的描述,给出ORS用例图中  (1)  和  (2)  所对应的关系。



参考答案:

(1)<<extend>>

(2)<<include>>。


解析:

根据说明中的描述,在ORS用例图中:

(1)在提交稿件的活动中,若标题和摘要输入、主题类型选择、稿件存储位置选择等步骤未完成,则重复这些步骤。这里描述的是一种扩展关系(Extend),表示在特定条件下,某些步骤会被重复执行。

(2)在审阅稿件给出意见的用例中,审稿人可以设置兴趣领域,然后审阅稿件并给出意见。这里描述的是包含关系(Include),表示一个用例包含另一个或多个子用例的执行。设置兴趣领域是审阅稿件给出意见的一部分或前置条件。

案例四:

【说明】

希尔排序算法又称最小增量排序算法,其基本思想是:

步骤1:构造一个步长序列delta、deltak、deltak,其中delta1=n/2,后面的每个delta是前一个的1/2,deltak=1;

步骤2:根据步长序列、进行k趟排序;

步骤3:对第i趟排序,根据对应的步长delta;将等步长位置元素分组,对同一组内元素在原位置上进行直接插入排序。



12、【问题1】根据说明和c代码,填充c代码中的空(1)~(4)。

参考答案:问题1:(1)k=k/2(2)k>1(3)data[k]<data[k-dk](4)data[j+dk]=t

解析:

根据题目给出的希尔排序算法说明和提供的图片中的C代码片段,我们可以填充C代码中的空白部分。对于(1),我们知道步长序列中的每个元素是前一个元素的一半,所以应该填充 delta_k = delta_k / 2。对于(2),由于我们进行的是递减步长序列的排序,所以当deltak大于1时继续排序,因此应该填充deltak > 1。对于(3),在直接插入排序中,我们需要比较当前位置的元素和它前一个位置元素的大小,如果前一个位置的元素大于当前位置的元素,则交换它们的位置,因此应该填充data[j-delta_k](当前位置往前delta_k个位置的值)> data[j](当前位置的值)。对于(4),在交换两个元素后,我们需要把交换后的值赋给data数组中正确的位置,所以应该填充data[j+delta_k](或 data[j](当前位置的值)< data[j+delta_k](当前位置往前delta_k个位置的值)和 data[j+delta_k] = t(把交换后的值赋给data[j+delta_k])。

13、【问题2】根据说明和c代码,该算法的时间复杂度(5)O(n²)(小于、等于或大于)。该算法是否稳定(6)(是或否)。

参考答案:问题2:(5)小于、(6)否

解析:

问题5:希尔排序算法的时间复杂度小于O(n²)。希尔排序算法在步长序列减小到1时,整个序列基本上是有序的,后续操作主要是进行直接插入排序,所以其时间复杂度比普通的冒泡排序、选择排序等算法要小。但希尔排序的时间复杂度分析较为复杂,无法准确给出一个具体的表达式,因此在实践中,通常认为希尔排序的时间复杂度小于O(n²)。

问题6:该算法不是稳定的排序算法。稳定排序算法要求在排序过程中相等的元素相对位置不变。从希尔排序算法的描述和提供的图片中可以看出,在排序过程中存在元素交换位置的情况,因此希尔排序不是稳定的排序算法。

14、【问题3】对数组(15、9、7、8、20、-1、4)用希尔排序方法进行排序,经过di一趟排序后得到的数组为(7)。

参考答案:问题3:(7)4,9,-1,8,20,7,15

解析:

希尔排序是一种基于插入排序的算法,其基本思想是将待排序的数组元素按照某个增量序列进行分组,对每组使用直接插入排序算法排序。在希尔排序中,增量序列的选择对算法的性能有很大的影响。题目中的描述是关于希尔排序的基本思想和一些关键步骤,但并没有给出具体的增量序列和排序过程。因此,对于问题3的答案需要根据希尔排序的基本思想进行推理和分析。在问题中给出的数组(15、9、7、8、20、-1、4)经过di一趟排序后得到的数组为(7),意味着最小的元素被移动到了数组的最前面位置。但由于增量序列和具体排序过程并未给出,我们无法确定其他元素的具体位置。因此,答案为(7,-1,4,8,9,未排序部分)是一个可能的排序结果。

二、问答题

试题五:阅读下列说明和(java++代码),将应填入(n)处的字句写在答题纸对应栏内。

[说明]在线支付是电子商务的一个重要环节,不同的电子商务平台提供不同的支付接口,现在需要给不同的商务平台的支付接口,使得客户在不同平台是购物时,不需要关系具体的支付接口。拟采用中介在(Mediator)设计模式来实现该需求,所设计的类图如图五—1所示。

class  concrete service Mediator:  public webserviceMediator{// concrete Mediator*

 Private:

       Webservice * amazon ;

       Webservice * ebay ;

 Public:

       Concreteservicemediator():amazon (NULL),ebay(NULL){ }

       Void SetAmazon(Webbsewice*anazon){this->amazon=amazon;}

       Void SetEbay(webservice*ebay){

this->ebay=ebay;

       }

       Void buy(double money,webservice->service){

       If (sevice=amazon)  amazon->search(money);

       Else ebay->search(money);

       }

       }

       class Amazon: public Webservice{

       Public:

          Void setmediator(webservicemediator*meditor){

          This->mediator=mediator;

         }

          Void buyservice (double money){

              Cout <<”Amazon receive”<<money<<endl;

             }

           } ;

         Class Ebay:public Webservice{

         Public:

              Void setMediator(webserriceMediator*mediator){

              this->mediator=mediator;

            }

           Void buyservice (double money){

(5) ;       

 }

Void search(double money) {

   Cout<<”Ebay receive;”<<money<<endl;

   }

} ;


15、试题五:阅读下列说明和Java代码,应填入  (n)  处。

【说明】

    某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表所示:

 为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图所示:


 其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、 CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与 QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为:类FlyNoWay与 FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与 QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。

【C++代码】

    #include<iostream>

using namespace std;    

class FlyBehavior{

    public:virtual void fly()=0;

    };

    class QuackBehavior{

    public:virtual void quack() = 0;

    };

    class FlyWithWings:public FlyBehavior{

    public:void fly(){  cout<< “使用翅膀飞行 ! ”  <<endl;  }

    };

    class FlyNoWay:public FlyBehavior{

    public:void fly(){  cout<< “不能飞行!”<<endl;}

    };

    class Quack:public QuackBehavior{

    public:void quack(){  cout<<“发出\‘嘎嘎\’声  !”<<endl;  }

    };

    class Squeak:public QuackBehavior{

    public:void quack(){cout<<“发出空气与橡皮摩擦声!”<<endl;   }

    };

    class QuackNoWay:public QuackBehavior{

    public:void quack  (){  cout<<“不能发声  !”<<endl;  }

    };

    class Duck{

    protected:

      FlyBehavior*  (1)  ;

      QuackBehavior*  (2)  ;

    public:

      void fly(){  (3)  ;  }

      void quack(){  (4)  ;);

      virtual void display()=0;

    };

    class RubberDuck:public Duck{

    public:

      RubberDuck(){

        flyBehavior=new   (5)  ;

        quackBehavior=new Squeak();

      }

      void display(){/*此处省略显示橡皮鸭的代码*/   }

    };

//其他代码省略


参考答案:

  (1) fiyBehavior

    (2) quackBehavior

    (3) flyBehavior->fly()

    (4) quackBehavior->quack()

(5) FlyNoWay()


解析:

(1) 在Duck类中,需要定义指向飞行行为类的指针,命名为flyBehavior。这是策略设计模式中的一部分,使得鸭子类可以与不同的飞行行为类关联。

(2) 同样地,在Duck类中,也需要定义指向发声行为类的指针,命名为quackBehavior。这是为了使得鸭子类可以与不同的发声行为类关联。

(3) 在Duck类的fly()方法中,通过调用flyBehavior指针所指向的对象的fly()方法来实现飞行行为。这是策略设计模式的核心,通过对象组合来动态改变行为。

(4) 在Duck类的quack()方法中,通过调用quackBehavior指针所指向的对象的quack()方法来实现发声行为。这也是策略设计模式的一部分。

(5) 在RubberDuck类的构造函数中,需要为flyBehavior指针分配内存,创建一个飞行行为类的实例。由于题目没有具体说明橡皮鸭的飞行特性,因此此处可以根据实际情况选择飞行行为类,例如选择不能飞行的行为类FlyNoWay或者能够飞行的行为类FlyWithWings等。同时,题目已经说明橡皮鸭的发声特性是发出空气与橡皮摩擦声,因此为quackBehavior分配内存,创建一个Squeak类的实例是正确的。

16、试题六:阅读下列说明和Java代码,应填入  (n)  处。

【说明】

    某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如下表所示:

 为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(Strategy)设计的类图如图所示:


 其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、 CottonDuck 和 RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;接口FlyBehavior与 QuackBehavior分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。

【Java代码】

      interface  FlyBehavior{

                   public void fly();

    };

    interface QuackBehavior{

                  public void quack();

    };

    class FlyWithWings implements FlyBehavior{

        public void fly(){System.out.println(“使用翅膀飞行!”);}

    };

    class FlyNoWay implements FlyBehavior{

        public void fly(){System.out.println(“不能飞行!”);}

    };

    class Quack implements QuackBehavior{

        public void quack(){System.out.println(“发出\‘嘎嘎\’声!”); }

    };

    class Squeak implements QuackBehavior{

        public void quack(){System.out.println(“发出空气与橡皮摩擦声 !”);

    }

    };

    class QuackNoWay implements QuackBehavior{

        public void quack(){System.out.println(“不能发声!”);}

    };

    abstract class Duck{

        protected  FlyBehavior  (1)  ;

        protected  QuackBehavior  (2)  ;

        public void fly(){  (3)  ;  }

        public void quack()  {  (4)  ;};

        public abstract void display();

    };

    class RubberDuck extends Duck{

        public RubberDuck(){

          flyBehavior=new  (5)  ;

          quackBehavior=new Squeak() ;

        }

        public void display(){/*此处省略显示橡皮鸭的代码*/  }

    };

    //其他代码省略


参考答案:

(1) flyBehavior           

(2) quackBehavior

(3) flyBehavior.fly()    

(4) quackBehavior.quack()

(5)FlyNoWay()

解析:

(1) 在抽象类Duck中,我们需要一个成员变量来存储鸭子的飞行行为,因此应该填入FlyBehavior。即,protected FlyBehavior flyBehavior。

(2) 同理,抽象类Duck中也需要一个成员变量来存储鸭子的发声行为,所以应该填入QuackBehavior。即,protected QuackBehavior quackBehavior。

(3) 在Duck类的fly()方法中,我们需要调用存储的飞行行为的fly()方法,所以填入flyBehavior.fly()。

(4) 在Duck类的quack()方法中,我们需要调用存储的发声行为的quack()方法,所以填入quackBehavior.quack()。

(5) 在RubberDuck类的构造函数中,我们需要为flyBehavior赋一个新的飞行行为实例。根据策略设计模式的设计,我们可以选择实现FlyBehavior接口的任一具体类,如FlyWithWings或FlyNoWay。因此,(5)处应填入FlyWithWings或FlyNoWay的实例,例如new FlyWithWings()或new FlyNoWay()。但根据题目给出的参考答案,此处应填入FlyNoWay(),表示橡皮鸭不能飞行。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2020年11月软件设计师下午题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share