1、软件设计师-28 及答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:20.00)1.阅读下列说明和 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 说明 某灯具厂商欲生产一个灯具遥控器,该遥控器具有 7 个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用 Command(命令)模式实现该遥控器的软件部分,Command 模式的类图如下图所示。 (分数:20.00)_二、试题二(总题数:1,分数:20.00)2.阅读下列说明和 C+代码,将应填入横线处的字句写在下面。 说明 某实验室欲
2、建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据,当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如下图所示。 (分数:20.00)_三、试题三(总题数:1,分数:20.00)3.阅读下列说明和 C+代码,将应填入_处。 说明 现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。 现采用原型模式(Prototype)来实现上述要求,得到如下图所示的类图。 (分数:20.00)_四、试题四(总题
3、数:1,分数:20.00)4.阅读以下说明和 C+代码,将应填入_处的字句写在下面。 说明 欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。 不同的绘图程序 DPI 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)_五
4、、试题五(总题数:1,分数:20.00)5.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以SQL Server 和 Access 两种数据库以及系统中的数据库表 Department 为例,其类图如下图所示。 (分数:20.00)_软件设计师-28 答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:20.00)1.阅读下列说明和 C+代码,将应填入(n)处的字句写在答题纸的对应栏内。 说明 某灯具厂商欲生产一个灯具遥控器,该遥控器具有 7 个可编程的插槽,每
5、个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用 Command(命令)模式实现该遥控器的软件部分,Command 模式的类图如下图所示。 (分数:20.00)_正确答案:()解析:void execute() light-on() light-off() onCommandsslot offCommandsslot onCommandsslot-execute() offCommandsslot-execute() 解析 本题考查 Command 命令模式的概念及应用,并用 C+语言实现。Command 命令模式是一种对象行为模式。它主要
6、解决的问题是,在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题,将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。二、试题二(总题数:1,分数:20.00)2.阅读下列说明和 C+代码,将应填入横线处的字句写在下面。 说明 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据,当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如下图所示。 (分数:20.00)_正确答案:()解析:Subject (*it)
7、-update(temperature,humidity,cleanness) notifyObservers() measurementsChanged() Observer() this-envData-registerObserver(this) 解析 当主题中的环境发生变化,也就是调用measurementsChanged()会通知观察者,即调用 notifyObservers(),在 notifyObservers()方法中,观察者会调用自身 update(float temperature,float humidity,float cleanness),在主题的registerOb
8、server(Observe*o)中会注册对主题感兴趣的观察者。三、试题三(总题数:1,分数:20.00)3.阅读下列说明和 C+代码,将应填入_处。 说明 现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。 现采用原型模式(Prototype)来实现上述要求,得到如下图所示的类图。 (分数:20.00)_正确答案:()解析:virtual Cloneable*Clone()=0; WorkExperience*obj; Work; Resume*obj; a-Clone() 解析 本题
9、考查原型模式的概念及应用,原型模型是一种对象创建模型,用原型实体指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模型允许一个对象再创建另一个可订制的对象,无需知道任何创建的细节。 Prototype 模式其实就是常说的”虚拟构造函数”一个实现,C+的实现机制中并没有支持这个特性,但是通过不同派生类实现的 Clone 接口函数可以完成与”虚拟构造函数”同样的效果。 题中声明一个虚拟基类,所有的原型都从这个基类继承,第一处所代表的就是这个基类中的纯虚函数,需要继承者自行实现,即为 virtual Cloneable*Clone()=0,首先声明一个抽象基类,并定义 clone()函数为纯
10、虚函数。然后根据基类实例化各个子类,并且实现复制构造函数,并实现 clone()函数,由此可知第二处为 WorkExperience*obj,第三处为 Work,第四处为 Resume*obj。在 main 函数中实现 Resume*b 对*a的复制,故根据 C+语法,第五处中为 a-Clone()。四、试题四(总题数:1,分数:20.00)4.阅读以下说明和 C+代码,将应填入_处的字句写在下面。 说明 欲开发一个绘图软件,要求使用不同的绘图程序绘制不同的图形。以绘制直线和圆形为例,对应的绘图程序如下表所示。 不同的绘图程序 DPI DP2 绘制直线 draw a line(x1,y1,x2
11、,y2) drawline(x1,x2,y1,y2) 绘制圆 draw a circle(x,y,r) drawcircle(x,y,r) 该绘图软件的扩展性要求,将不断扩充新的图形和新的绘图程序。为了避免出现类爆炸的情况,现采用桥接(Bridge)模式来实现上述要求,得到如下图所示的类图。 (分数:20.00)_正确答案:()解析:virtual void drawLine(double x1,double y1,double x2,double y2)=0; virtual void drawCircle(double x,double y,double r)=0; DP1:draw_a_
12、ircle(x,y,r); DP2:drawCircle(x,y,r); virtual void draw()=0 Shape(dp) 解析 本题考查 Bridge 桥接模式的概念及应用,将抽象与其实现解耦,使它们都可以独立地变化。大致意思是说:将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类) Drawing 是一个虚拟基类,里面包含了希望不同策略实现的算法,派生类 V1Drawing,V2Drawing 都派生自 Drawing,对基类中的希望实现的算法都作了具体实现,且它们都含有 drawLine 和
13、 drawCircle 函数,所以 Draw 类中缺失的应该是这两个算法,于是:第一处为“virtual void drawLine(double x1,double y1,double x2,double y2=0;”第二处为“virtual void drawCircle(double x,double y,doubler)=0;”,DP1 和 DP2 中包含了绘制 Line 和 Circle 的具体实现的 Static 方法,因此在 V1Drawing、V2Drawing 类中可以直接调用它们;(3)为“DP1:draw a circle(x,y,r);”,第四处为“DP2:drawCi
14、rcle(x,y,r);”。Shape 类派生出 Rectangle 和 Circle 类,里面都含有 draw 方法,但是具体 draw 方法的实现却不相同,所以第五处为“virtual void draw()=0;”,最后 Circle 的构造函数初始化了后 4 个变量,还有继承自shape 的变量_dp 未做初始化,因此调 shape 构造函数做初始化操作,第六处为“shape(dp);”。五、试题五(总题数:1,分数:20.00)5.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统。以S
15、QL Server 和 Access 两种数据库以及系统中的数据库表 Department 为例,其类图如下图所示。 (分数:20.00)_正确答案:()解析:virtual void Insert(Department*department) virtual Department GetDepartment (int id) public IDepartment public IDepartment class Ifactory virtual IDepartment*CreateDepartment() 解析 本题考查抽象工厂设计模式的概念及其应用。 抽象工厂设计模式的意图是:提供一个创建
16、一系列相关或相互依赖的对象,而无须指出它们具体的类。在如下情况下应当考虑使用抽象工厂模式: 当一个系统要独立于它的产品的创建、组合和表示时。 当一个系统要由多个产品系列中的一个来配置时。 当需强调一系列相关的产品对象的设计以便进行联合使用时。 想提供一组对象而不显示它们的实现过程,只显示它们的接口时。 抽象工厂设计模式的类图如下图所示,其中: AbstractFactory 为抽象工厂,声明抽象产品的方法。 ConcreteFactory 为具体工厂,执行生戍抽象产品的方法,生成一个具体的产品。 AbstractProduct 为抽象产品,为一种产品声明接口。 Product 为具体产品,定义具体工厂生成的具体产品的对象,实现产品接口。