1、软件水平考试(中级)软件设计师下午(应用技术)历年真题试卷汇编 6及答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表 164所示。为支持将来模拟更多种类的飞机,采用策略设计模式 (Strategy)设计的类图如图 16一 12所示。图 1612中, AirCraft为抽象类,描述了抽象的飞机,而类 Helicopter、AirPlane、 Fighter和 Harrier分别描述具体的飞机 种类,方法 ny()和 takeOff()分别表示不同飞机都具有飞行特征和
2、起飞特征;类 FlyBehavior与 TakeOffiehaVior为抽象类,分别用于表示抽象的飞行为与起飞行为;类 SubSonicFly与 SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类 VerticalTakeOff与LongDistanceTakeOff分别描述垂直起飞与长距离起飞的行为。 【 C+代码】 #include USing namespace std; ClasS FlyBehaVior public: virtual void fly()=0; ; class SubSonicFly: public FlyBehavior( public: void
3、 fly()(cout 2 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。现采用原型模式 (Prototype)来实现上述要求,得到如图 171所示的类图。 Java代 码 Class WorkExperience (1)Cloneable(工作简历 Private String workDate; Private String company; Public Object Clone() (2);
4、 obj workDate=thi s workDate; Obj companythi s company; Return obj; Class Resume (3) Cloneable( 简历 Private String name; Private String sexj Private String age; Private WorkExperience work; Public Resume(String name) Thi s name=name; work=new WorkExperience(); Private Resume(WorkExperience work) This
5、 woek= (4); Public void SetPersonalInfo(String sex, String age)( *代码省略 * ) Public void SetWorkExperience(String workDate, String company)( *代码省略 * ) Public Object Clone()( Resume obj= (5) ; 其余代码省略 Return obj; Class WorkResume( Public static void main(Stringargs)( Resume a=new Resume(“张三 ”); ASetPers
6、onalInfo(“男 ”, “29”); a.setworkExperience(“19982000”, “XXX公司 ”); Resume b=(6); b.SetWorkExperience(”2 001 2 006”, ”YYY公司 ”; 3 阅读以下说明和 Java代码,将应填入 (n)处的字句写在对应栏内。【说明】欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如表 171所示。该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接 (Bridge)模式来实现上述要求,得 到如图 172所示的类图
7、。Java代码 (1)Drawing( (2) ; (3) ; ciass DPI( static public void draw aline(double xl, double y1, double x2, double y2) ( *代码省略 * ) static public void drawacircle(double x, double y, double r)( *代码省略 * ) ; Class DP2 static pubiic void drawline(double x1, double x2, double y1, double y2) ( *代码省略 * ) sta
8、tic public void drawcircle(double x, double Y, double r)( *代码省略 * ) ; class VlDrawing implements Drawing( public void drawLine(double xl, double yl, double x2, doubIe y2)( *代码省略 * ) public void drawCircle(double X, double Y, double r)( (4) ; ) ; class V2Drawing implementS Drawing( public void drawLi
9、ne(double xl, double yl, double x2, double y2) *代码省略 * ) public void drawCircie(doubie X, double y, double r)( (5) ; ) ; abstract class Shape( private Drawingdp; (6) ; Shape(Drawing dp)_dp=dp; ) publ ic void drawLine(double xl, double yl, double x2, double y2)(_ dp drawLine(x1, y1, x2, y2); ) public
10、 void drawCircle(double X, double Y, doubler)(一 dp drawCircle(x, y, r); ) ; Class Rectangle extends Shape( private double_x1, _x2,_y1,_y2; public Rectangle(Drawing dp, double xl, double yl, double x2, double y2) *代码省略 * public void draw()( 代码省略。 ) ; ClasS Circle extends Shape private double x, _y, _
11、r; public Circle(Drawing dp, double x, double Y, double r)( *代码省略 * public void draw()(drawCircle(_x, _y, _r); ; 4 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以 SQL SerVer和 Access两种数据库以及系统中的数据库表Depanment为例,其类图如图 173所示。Java代码 import java.util*; clasS Department( *代码省略 * )interface IDepartment( (1) ;
12、(2) ; class SqlserVerDepar七 men七: (3) public: void Insert(Department department) System out print in(”Insert a record into Department in SQL Servern”); 其余代码省略 publ i c Department GetDepar七 men七 (int id)0)tiSsureMachine setState(4);e1SetissureMachine setState(5); 7 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应
13、栏内。【说明】某公司的组织结构图如图 179所示,现采用组合 (Composition)设计模式来设计,得到如图 1710所示的类图。其中 Company为抽象类,定义了在组织结构图上添加 (Add)和删除 (Delete)分公司办事处或者部门的方法接口。类 ConcreteCompany表示具体的分公司或者办事处,分公司或办事处下可以 设置不同的部门。类 HRDepament和FinanceDepartment分别表示人力资源部和财务部。 Java代码 importjava.util.*:(1)CompanyprotectedStringname;publicCompany(Stringna
14、me)(2)=name; DublicabstractvoidAdd(Companyc);增加子公司、办事处或部门 DublicabstractvoidDelete(Companyc);删除子公司、办事处或部门 C1assConcreteCompanyextendsCompanyprivateListchildren=newArrayList();存储子公司、办事处或部门publicConcreteCompany(Stringname)super(name); )publiCvoidAdd(Companyc)(5)addc;)publicvoidDelete(Companyc)(6) remo
15、ve(C); )C1assHRDepartmentextendsCompany(publiCHRDepartment(Stringname)(super(name); )其他代码省略 C1assFinanceDepartmentextendsCompany(publicFinanceDepartment(Stringname)(super(name); )其他代码省略 publiCClassTestpublicstatiCvoidmain(Stringargs)(c。ncretecompanyroot=newconcretecompany(“北京总公司 ”);root Add(newHRDep
16、artment(”总公司人力资源部 ”);root Add(newFinanceDepartment(“总公司财务部 ”);concretecompanycomp=newcOncretecompany(“上海分公司 ”);comp Add(newHRDepartment(“上海分公司人力资源部 ”);comp Add(newFinanceDepartment(“上海分公司财务部 ”); (7);ConcreteCompanycompl=newconcretecompany(”南京办事处 ”);compl Add(newHRDepartment(”南京办事处人力 资源部 ”);compl Add
17、(newFinanceDepartment(”南京办事处财务部 ”); (8);其他代码省略 8 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。【说明】某软件公司现欲开发一款飞机飞行模拟系统,该系统主要模拟不同种类飞机的飞行特征与起飞特征。需要模拟的飞机种类及其特征如表 173所示。为支持将来模拟更多种类的飞机,采用策略设计模式 (Strategy)设计的类图如图1711所示。图 1711中, AirCraft为抽象类,描述了抽象的飞机,而类 Helicopter、AirPlane、 Fighter和 Harrier分别描述具体的飞机种类,方法 fly()和 ta
18、keOff()分别表示不同飞机都具有飞行特征和起飞特征类 FlyBehavior与 TakeOffBehavior为抽象类,分别用于表示抽象的飞行为与起飞行为;类 SubSonicFly与 SuperSonicFly分别描述亚音速飞行和超音速飞行的行为;类 VerticalTakeOff与L0ngDistanceTakeoff分别描述垂直起飞 与长距离起飞的行为。 Java代码 interfaceFlyBehavior(publiCVOidfly(); ;classSubSonicFlyimplementsFlyBehaVior(publicvoidfly()(System out print
19、in(“亚音速飞行 !”); );ClassSuperSonicFlyimplementsFlyBehaVior(publicvoidfly()(System out println(”超音速飞行 !”); ); interfaceTakeOffBehaviorpublicvoidtakeOff(); ;ClassVerticalTakeOffimplementsTakeOffBehavior(publicvoidtakeOff()(System out println(“垂直起飞 !”); );ClassLongDistanceTakeOffimplementsTakeOffBehavior
20、publicvoidtakeOff() 软件水平考试(中级)软件设计师下午(应用技术)历年真题试卷汇编 6答案与解析 一、必答题(共 4道大题,每道大题 15分) 1 【正 确答案】 (1)FlyBehavior*flyBehavior。 (2)TakeOffBehavior*takeOffBehavior (3)flyBehavior一 fly() (4)takeOffBehavior一 takeoff()_ (5)SubSonicFly (6)VerticalTakeOff() (7) Helicopter() 注:空 (1)与空 (2)参考答案可互换 【试题解析】 本题考查了设计模式中的
21、策略设计模式。 从本题的叙述中可以看出,存在 4种不同的飞机类型,但每种飞机类型的起飞特征和飞行特征并不完全相同,这就使得我们很难采用比较直接的方法来实现重用。例如,定义一个抽象的飞机类,实现飞机的起飞特性,然后 4种飞机直接重用该特征。但是,我们可以观察到,尽管飞机的起飞特征和飞行特征有所不同,有一点可以肯定的是,每一种飞机都具备了飞行特征和起飞特征。因此,可以抽象出一个飞机类,其中含有飞行特征与起飞特征,但关于两个特征的实现要单独抽取出来,所以义形成了 FlyBehavior类和 TakeOffBehavior类分别表 示抽象的飞行和起飞特征,而这两个类的子类则分别实现不同的起飞和飞行特征
22、,因此,在创建一个具体的飞机时,给其赋予不同的起飞特征和飞行特征即可。 本题中的空 (1)和 (2)应该填写成员变量,根据类图可以得知,此处应该表示的是飞行和起飞特征变量,在 C+中可以采用指针来表示。空 (3)和空 (4)处需要实现飞行与起飞特征,但 AirCraft是抽象的类,所以把实现代理给指针变量。 Helicopter类需要指定由父类继承而来的成员变量的初始值,因为 Helicopter的特征是垂直起飞和亚音速飞行,因此生成这两个特征 的对象,分别赋值给 nyBehavior和takeOffBehavior变量。 【知识模块】 C+程序设计 2 【正确答案】 (1)implement
23、s (2)WorkExperience obj: new WorkExperienceO (3)implements (4)(WorkExperence)work Clone() (5)new Resume(this work) (6)AClone() 【试题解析】 本题考查原型模式的概念及应用,原型模型是一种对象创建模 型,用原型实体指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模型允许一个对象再创建另一个可订制的对象,无需知道任何创建的细节。 所有的 Java类都继承自 java.lang Object,而 0bject类提供一个 Clone()方法,可以将一个 Java对象复
24、制一份。因此在 Java中可以直接使用 Object提供的Clone()方法来实现对象的克隆。能够实现克隆的 java类必须实现一个标识接口Cloneable,表示这个 java类支持复制。 题中 WorkExperience类和 Resume类需要实 Cloneable接口,故 (1)和 (3)为implements, WorkExperience中需要实现 Clone方法,并将自身复制一份,由下面的代码可知 (2)为 WorkExpefience obj=new WorkExperience()。 Resume类中的私有构造方法实现 WorkExperience的深复制,故 (4)中为 (
25、Work Experence) work Clone(),而 Resume类中 Clone方法实现自身的复制,故 (5)中为 new Resume(mis work)。在 main中实 现 Resume b对 a的复制,故 (6)中为AClone()。 【知识模块】 C+程序设计 3 【正确答案】 (1)abstract C1as s; (2)publiC abstract void drawLine(double x1, double y1, double x2, double y2) ; (3)public absttact void drawCircle(double x, double
26、 y, double r); (4)DPI drawaircle(x, y, r); (5)DP2 drawCircie(x, y, r); (6)publiC abstract void draw(); 【试题解析】 本题考查 Bridge桥接模式的概念及应用,将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。 java语言中声明抽象函数用 abstract,且每个函数都需要声明访问类型。对照试题五的代码我们可以看出: (1)为 abstract class;这里的实现指的是抽象类及其派生类用来实现自己的对象 (而不是抽象类的派生类 ,这些派生类
27、被称为具体类 )Drawing一个虚拟基类,里面包含了希望不同策略实现的算法,派生类V1Drawing, V2Drawing都派生 19Drawing,对基类中的希望实现的算法都作了具体实现,且它们都含有 drawLine和 drawCircle函数,所 Draw类中缺失的应该是这两个算法,于是 (2)public abstract void drawLine(double x1, double y1,double x2, double y2); (3)public abstract void drawCircle(double x, double y,double r); DPI$IDP2包
28、含了绘制 Line和 Circle的具体实现的 Static方法,因此在 VlDrawing, V2Drawing类中可以直接进行调用它们 (4) DPI drawacircle(x, y, r)(5)DP2 drawCircle(x, y, r); Shape类派生出Rectangle和 Circle类,里面都含有 draw方法,但是具体 draw方法的实现却不相同,所以 (6)public abstract void draw。 【知识模块】 C+程序设计 4 【正确答案】 (1)void Insert(Department department) (2)Department GetDep
29、artment(int id) (3)implements IDepartment (4)implements IDepartment (5)interface IFactory (6)IDepartment CreateDepartmento 【试题解析】 本题考查抽象工厂设计模式的概念及其应用。其类图如图 174所示。抽象工厂设计模式的意图是:提供一个创建一系列相关或相互依赖的对象,而无须指出它们具体的类。在如下情况下应当考虑使用抽象工厂模式: 当一个系统要独立于它的产品的创建、组合和表示时; 当一个系统要由多个产品系列中的一个来配置时: 当需强调一系列相关的产品对象的设计以便进行联合使用
30、时;想提供一组对象而不显示它们的实现过程,只显示它们的接口时。抽象工厂设计模式的类图如下所示,其中: AbstractFactory抽象工厂,声明抽象产品的方法。ConcreteFaCtory为具体工厂,执行生成抽象产品的方法 ,生成一个具体的产品。AbstractProduct为抽象产品,为一种产品声明接口。 Product为具体产品,定义具体工厂生成的具体产品的对象,实现产品接口。 图 173中的 IFactory对应类图中的 AbstractFactory, Sqlserverfactory和 Accessfactory对应类图中的ConcreteFactory, SqlserverDe
31、partment和 AccessDepartment对应类图中的Product,而 IDepartment对应类图中的 AbstractProduct。 空 (1)和空 (2)考查接12IDepartment中方法的定义。由其子类 SqlserverDepartment和AccessDepartment中方法的定义,可知空 (1)处应填入 void Insert(Department department),空 (2)处应填入 Department GetDepartment(int id)。 空 (3)和空 (4)考查接口 IDepartmentl实现。接口的实现是在一个类的声明中使用关键字
32、“implements”来表示该类使用某个已经定义的接口,然后即可在该类体中使用接口中 定义的常量,而且必须实现接口中定义的所有方法。因此,空 (3)和空 (4)都应填入 implements IDepartment。 由于所给程序中缺少接口 IFactory的定义,因此空 (5)处应为定义接 ElIFactory,应填入 interface IFactory。由于类Sqlserverfactory和 Accessfactory中必须实现接口 Ifactory 定义的所有方法,观察这两个类中的方法可知,空 (6)处应填入 IDepartment CreateDepartment0。 【知识模块
33、】 C+程序设 计 5 【正确答案】 (1)abstract (2)String getDescription (3)abstract int cost() (4)Beverage beverage (5)beverage (6)beverage 【试题解析】 装饰器模式描述了如何动态地为一个对象添加职责。该模式采用递归方式组合对象,从而允许添加任意多的对象职责。在下列情况下可以使用装饰器模式: (1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 (2)处理那些可以撤销的 职责。 (3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将
34、产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 装饰器模式的结构如图 176所示。其中:抽象组件角色 (Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这些对象动态地添加职责。具体组件角色 (ConcreteComponent):被装饰者,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。抽象装饰器 (Decorator):维持一个指向构件 Component对象的实例,并定义一个与抽象组件角色 Component接口一致的接口。具体装饰器角色 (Concrete Decorator):向组件添
35、加职责。 图 175中的 Beverage对应的就是上图中的抽象类 Component, Espresso和 DarkRoast对应的是 ConcreteComponent,CondimentDecorator对应抽象装饰器 Decorator, Mocha和 Whip扮演的是类CondimentDecorator的具体装饰器角色 Concrete Decorator。 由于类 Beverage为其子类提供了统一的操作接口,所以将其定义为抽象类。通过可以在类名前加abstract关键字来定义抽象类,因此 (1)处应填入 abstract。 (2)和 (3)处考查构造函数的定义。从 (2)处构造
36、函数体中返回值的类型及后续的子类继承程序可知, (2)处应填 )kString getDescriptiom从 public int cost()retum ESPRESSOPRICE; 可以看出, cost()函数的返回值为常量,因此 (3)处应填入 abstract int cost()。 (4)处考查对 CondimentDecorator的定义,在该类中声明一类成员变量,并在this beverage=beveragelreturn beverage getDescription0+”, Mocha”加以使用。因此 (4)处应填入 Beverage beverage;。 (5)和 (6
37、)处考查实例化类模板的方法。类模板必须在实例化后才能使用。实例化类模板时,要给出类型实参。从类图可知, (5)和 (6)处均应填 Abeverage。 【知识模块】 C+程序设计 6 【正 确答案】 (1)State (2)tissueMachine getHasQuarterState()或 newHasQuarterState()或tissueMachine HasQuarterState() (3)tissueMachine getNoQuarterState()或 newNoQuarterState()或tissueMachine NoQuarterState() (4)tissueM
38、achine getNoQuarterState()或 newNoQuarterState()或tissueMachine NoQuarterState() (5)tissueMachine getSoldOutState()或 newSoldOutState()或tissueMachine SoldOutState() 【试题解析】 (1)根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。 State定义了纸巾售卖机所对应的一些状态,售出纸巾、纸巾售完等状态。类 SoldOutState、 NoQuarterState、HasQuarterState、 So
39、ldState均有类 State派生而来。 (2)publicvoidinsertQuarter0定义了一个 “投币 ”的方法:在没有 “2元钱 ”时,客户投币的方法。tissureMachine setState是改变纸巾售卖机的状态,此时,客户已投入 2元钱,故将此时的状态改为 “有 2元钱 ”的状态,纸巾售卖机调用 “有 2元钱 ”状态的方法即可。 (3)publicvoidejectQuarter()定义了一个 “退币 ”的方法:在有 2元钱的状态下,用户按下退币按钮,纸巾售卖机将此时的状态改为 “没有投币 ”状态,故直接调用 NoQuarterState即 可。 (4)根据纸巾售卖机
40、状态图可知,当售出纸巾,并且纸巾数量仍大于 0时,将返回 “没有投币 ”状态,同第 (3)小题的分析,此处应调用 NoQuarterState()。 (5)根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量等于 O时,将返回 “纸巾售完 ”状态,此处用了 if “else 判断语句,当纸巾数量仍大于 0 时,返回 “没有投币 ”状态,否则,纸巾数量一定等于 0,本段程序第 (5)空是 else下的一条语句,故此处是判断 count为 0时,纸巾售卖机的状态,显然,应调用 SoldOutState。 【知识模块】 C+程序设计 7 【正确答案】 (1)ahstractclass (2)this
41、name (3)Company (4)Company (5)children (6)children (7)root Add(comp) (8)comp Add(compl) 【试题解析】 Company为抽象类,所以 (1)肯定为 abstractclass: (2)所在的语句为构造函数,用来对 name字段进行初始化; 子公司、办事处或部门都是 Company这个抽象类的具体实现,所以 (3)处为compally(4)处为 Company; (5)处所在的语句的作用是向 Company列表的实例 children中添加节点; (6)处所在的语句的作用从 Company列表的实例 child
42、renqb删除节点; (7)处所在的语句的作用把上海分公司这个子节点加入到北京公司总部这个跟节点中; (8)处所在的语句的作用将南京办事处这个子节点加入到上海分公司这个父节点中。 【知识模块】 C+程序设计 8 【正确答案】 (1)FlyBehaviorflyBehavior (2)TakeOffBehaviortakeOffBehavior (3)flyBehavior fly() (4)takeOffBehavior takeOff() (5)extends (6)SubSonicFly() (7)VerticalTakeOflff() 【试题解析】 本题目考查设计模式中的策略设计模式。从
43、本题的叙述中可以看出,存在四种不同的飞机类型,但每种飞机类型的起飞特征和飞行特征并不完全相同,这就使得我们很难采用比较直接的方法来实现重用。例如,定义一个抽象的飞机类,实现飞机的起飞特性,然后四种飞机直接重用该特征。但是,我们可以观察到,尽管飞机 的起飞特征和飞机特征有所不同,有一点可以肯定的是,每一种飞机都具备了飞行特征和起飞特征。因此,可以抽象出一个飞机类,其中含有飞行特征与起飞特征,但关于两个特征的实现要单独抽取出来,所以又形成FlyBehavior类 SHTakeOffBehavior类,分别表示抽象的飞行和起飞特征,而这两个类的子类则分别实现不同的起飞和飞行特征,最终转化为,在创建一个具体的飞机时,给其赋予不同的起飞特征和飞行特征即可。本题中的空 (1)和空 (2)应该填写成员变量,根据类图可以得知,此处应该表示的是飞行和起飞特征变量。空 (3)和 空 (4)处需要实现飞行与起飞特征,但 AirCraft是抽象的类,所以把实现代理给指针变量。 Helicopter类需要制定由父类继承而来的成员变量的初始值,因为Helicopter的特征是垂直起飞和亚音速飞行,因此生成这两个特征的对象,分别赋值给 flyBehaviorfHtakeOffBehavior变量。 【知识模块】 C+程序设计