1、软件设计师-30 及答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:20.00)1.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。 现采用原型模式(Prototype)来实现上述要求,得到如下图所示的类图。 (分数:20.00)_二、试题二(总题数:1,分数:20.00)2.阅读以下说明和 Java 代码,将应填入_处的字句写在下面。 说明 欲开发一个绘图软件,要求使用不同的绘图程序
2、绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。 不同的绘图程序 DP1 DP2 绘制直线 draw a line(x1,y1,x2,y2) drawline(x1,x2,y1,y2) 绘制圆 draw a circle(x,y,r) drawcircle(x,y,r) 该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如下图所示的类图。 (分数:20.00)_三、试题三(总题数:1,分数:20.00)3.阅读下列说明 Java 代码,将应填入_处的字句写在下面。 说明 现欲开发一个软件系统,要
3、求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQL Server 和 Access 两种数据库以及系统中的数据库表 Department 为例,其类图如图 1 所示。 (分数:20.00)_四、试题四(总题数:1,分数:20.00)4.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。 咖啡 价格/杯(¥) 配料 价格/杯(¥) 蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10 深度烘焙咖啡(DarkR
4、oast) 20 奶泡(Whip) 8 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如下图所示的类图。 (分数:20.00)_五、试题五(总题数:1,分数:20.00)5.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 某大型商场内安装了多个简易的纸巾售卖机,自动售出 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图 1 所示。 图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、SoldOutState、N
5、oQuarterState 和 HasQuanerState 分别对应图 1 中纸巾售卖机的 4 中状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。 (分数:20.00)_软件设计师-30 答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:20.00)1.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。 现采用原型模式(Prototype)来实现上述要求,得到如下图所示的类图。 (分数
6、:20.00)_正确答案:()解析:implements WorkExperience obj=new WorkExperience() implements (WorkExperence)work.Clone() new Resume(this.work) a.Clone() 解析 本题考查原型模式的概念及应用,原型模型是一种对象创建模型,用原型实体指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模型允许一个对象再创建另一个可订制的对象,无需知道任何创建的细节。 所有的 Java 类都继承自 java.lang.Object,而 object 类提供一个 Clone()方法,可以将
7、一个 Java 对象复制一份。因此在 Java 中可以直接使用 Object 提供的 Clone()方法来实现对象的克隆。能够实现克隆的java 类必须实现一个标识接口 Cloneable,表示这个 java 类支持复制。 题中 WorkExperience 类和 Resume 类需要实现 Cloneable 接口,故第一个空和第三个空为implements,WorkExperience 中需要实现 Clone 方法,并将自身复制一份,由下面的代码可知第二个空为 WorkExperience obj=newWorkExperience()。Resume 类中的私有构造方法实现 WorkExpe
8、fience 的深复制,故第四处中为(Work Experence)work.Clone(),而 Resume 类中 Clone 方法实现自身的复制,故第五处中为“newResume(this.work)”。 在 main 中实现 Resume b 对 a 的复制,故第六处中为“a.Clone()”。二、试题二(总题数:1,分数:20.00)2.阅读以下说明和 Java 代码,将应填入_处的字句写在下面。 说明 欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。 不同的绘图程序 DP1 DP2 绘制直线 draw a line(x1,y1
9、,x2,y2) drawline(x1,x2,y1,y2) 绘制圆 draw a circle(x,y,r) drawcircle(x,y,r) 该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如下图所示的类图。 (分数:20.00)_正确答案:()解析:interface; void drawLine(double x1,double y1,double x2,double y2); void drawCircle(double x,double y,double r); DP1.draw_a circle
10、(x,y,r); DP2.drawCircle(x,y,r); abstract public void draw(); 解析 本题考查 Bridge 桥接模式的概念及应用,将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。Java 语言中声明抽象函数时可利用 abstract,且每个函数都需要声明访问类型。对照试题五的代码我们可以看出:第一个空为 interface,这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类),Drawing 是一个虚拟基类,里面包含了希望利用不同策略实现的算法,派生类 V1
11、Drawing,V2Drawing 都派生自 Drawing,对基类中希望实现的算法都作了具体实现,且它们都含有drawLine 和 drawCircle 函数,所以 Draw 类中缺失的应该是这两个算法,于是第二处为“void drawLine(double x1,doubley1,doublex2,double y2);”,第三处为“voiddrawCircle(doublex,doubley,double r);”,DP1 和 DP2 中包含了绘制 Line 和 Circle 的具体实现 Static 的方法,因此在 V1Drawing、V2Drawing 类中可以直接调用它们,第四处为
12、“DP1.draw_a_circle(x,y,r)第五处 DP2.drawCircle(x,y,r);”,Shape 类派生出 Rectangle 和 Circle类,里面都含有 draw 方法,但是具体 draw 方法的实现却不相同,所以第六处为“abstractpublicvoid draw”。三、试题三(总题数:1,分数:20.00)3.阅读下列说明 Java 代码,将应填入_处的字句写在下面。 说明 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQL Server 和 Access 两种数据库以及系统中的数据库表 Department 为例
13、,其类图如图 1 所示。 (分数:20.00)_正确答案:()解析:void Insert(Department department) Department GetDepartment(int id) implements IDepartment implements Department interface IFactory IDepartment CreateDepartment() 解析 本题考查抽象工厂设计模式的概念及其应用。其类图如图 2 所示。 四、试题四(总题数:1,分数:20.00)4.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 某咖啡店当卖咖啡时,可
14、以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。 咖啡 价格/杯(¥) 配料 价格/杯(¥) 蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10 深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如下图所示的类图。 (分数:20.00)_正确答案:()解析:abstract String getDescription abstractirt cost() Beverage beverage beverage beverage 解析 装饰
15、器模式描述了如何动态地为一个对象添加职责。该模式采用递归方式组合对象,从而允许添加任意多的对象职责。在下列情况下可以使用装饰器模式: (1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 (2)处理那些可以撤销的职责。 (3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。 装饰器模式的结构如图 2 所示。其中: 五、试题五(总题数:1,分数:20.00)5.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 某大型商场
16、内安装了多个简易的纸巾售卖机,自动售出 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图 1 所示。 图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、SoldOutState、NoQuarterState 和 HasQuanerState 分别对应图 1 中纸巾售卖机的 4 中状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。 (分数:20.00)_正确答案:()解析:State tissueMachine.getHasQuarterState
17、()或 new HasQuarterState()或 tissueMachine.HasQuarterState() tissueMachine.getNoQuarterState()或 new NoQuarterState()或 tissueMachine.NoQuarterState() tissueMachine.getNoQuarterState()或 new NoQuarterState()或 tissueMachine.NoQuarterState() tissueMacbine.getSoldOutState()或 new SoldOutState()或 tissueMachin
18、e.SoldOutState() 解析 根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。State 定义了纸巾售卖机所对应的一些状态,售出纸巾、纸巾售完等状态。类SoldOutState、NoQuarterState、HasQuarterState、SoldState 均有类 State 派生而来。 public void insertQuarter()定义了一个“投币”的方法:在没有“2 元钱”时,客户投币的方法。tissureMachine.setState 是改变纸巾售卖机的状态,此时,客户已投入 2 元钱,故将此时的状态改为“有 2 元钱”的状态,纸
19、巾售卖机调用“有 2 元钱”状态的方法即可。 public void ejectQuarter()定义了一个“退币”的方法:在有 2 元钱的状态下,用户按下“退币”按钮,纸巾售卖机将此时的状态改为“没有投币”状态,故直接调用 NoQuarterState()即可。 根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量仍大于 0 时,将返回“没有投币”状态,此处应调用 NoQuarterState()。 根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量等于 0 时,将返回“纸巾售完”状态,此处用了ifelse 判断语句,当纸巾数量仍大于 0 时,返回“没有投币”状态,否则,纸巾数量一定等于 0,本段程序第五空是 else 下的一条语句,故此处是判断 count 为 0 时,纸巾售卖机的状态,显然,应调用SoldOutState。