1、软件设计师-29 及答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:20.00)1.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。 咖啡 价格/杯(¥) 配料 价格/杯(¥) 蒸馏咖啡(Espresso) 25 摩卡(Mocha) 10 深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如下图所示的类图。 (分数:20.00)_
2、二、试题二(总题数:1,分数:20.00)2.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 某大型商场内安装了多个简易的纸巾售卖机,自动售出 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图 1 所示。 图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、SoldOutState、NoQuanerstate 和 HasQuanerState 分别对应图 1 中纸巾售卖机的 4 中状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。 (
3、分数:20.00)_三、试题三(总题数:1,分数:20.00)3.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图 1 所示。现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中添加新的餐饮形式,得到如图 2 所示的类图,其中MenuComponent 为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类 Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图 1 中的甜点菜单,类 MenuItem 表示菜单
4、中的菜式。 图 1 菜单结构图(分数:20.00)_四、试题四(总题数:1,分数:20.00)4.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 某灯具厂商欲生产一个灯具遥控器,该遥控器具有 7 个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用 Command(命令)模式实现该遥控器的软件部分,Command 模式的类图如下图所示。 (分数:20.00)_五、试题五(总题数:1,分数:20.00)5.阅读下列说明和 Java 代码,将应填入_的字句写在下面。 说明 某实验室欲建立一个实验室环境监测系统,
5、能够显示实验室的温度、湿度以及洁净度等环境数据,当获取到最新的环境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如下图 2 所示。 (分数:20.00)_软件设计师-29 答案解析(总分:100.00,做题时间:90 分钟)一、试题一(总题数:1,分数:20.00)1.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 某咖啡店当卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。 咖啡 价格/杯(¥) 配料 价格/杯(¥) 蒸馏咖啡(Espress
6、o) 25 摩卡(Mocha) 10 深度烘焙咖啡(DarkRoast) 20 奶泡(Whip) 8 现采用装饰器(Decorator)模式来实现计算费用的功能,得到如下图所示的类图。 (分数:20.00)_正确答案:()解析:protected virtual string getDescription virtual int cost()=0 Beverage*beverage beverage beverage 解析 由类图可知,Beverage 是基类,Espresso、DarkRoast、CondimentDecorator 是 Beverage 的派生类,Mocha、Whip 又是
7、CondimentDecorator 的派生类。 第一处应填入 description 的访问控制类型,可能为 private 或 protected。在 Beverage 的派生类Espresso 的初始化函数中直接使用 description,由此可知,在基类中,description 的访问控制类型为protected。如果为 private,则在派生中不能使用。 在基类中先后动态建立了一个 DarkRoast 对象、Mocha 对象和 Whip 对象,调用初始化函数,并输出。 在 Mocha 类和 Whip 类中分别调用了基类的 getDescription()cost()。二、试题二
8、(总题数:1,分数:20.00)2.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 某大型商场内安装了多个简易的纸巾售卖机,自动售出 2 元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图 1 所示。 图 1 纸巾售卖机状态图采用状态(State)模式来实现该纸巾售卖机,得到如图 2 所示的类图。其中类 State 为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、SoldOutState、NoQuanerstate 和 HasQuanerState 分别对应图 1 中纸巾售卖机的 4 中状态:售出纸巾、纸巾售完、没有投币、有 2 元钱。 (分数:20
9、.00)_正确答案:()解析:State tissueMachine-getHasQuaiterState()或 new HasQuarterState tissueMachine-getNoQuarterState()或 new NoQuarterState tissueMachine-getNoQuarterState()或 new NoQuarterState tissueMachine-getSoldOutState()或 new SoldOutState 解析 根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。State 定义了纸巾售卖机所对应的一些
10、状态,售出纸巾、纸巾售完等状态。类 SoldOutState、NoQuarterState、HasQuarterState、SoldState 均有类State 派生而来。 void insertQuarter()定义了一个“投币”的方法:在没有“2 元钱”时,客户投币的方法。tissureMachine.setState 是改变纸巾售卖机的状态,此时,客户已投入 2 元钱,故将此时的状态改为“有 2 元钱”的状态,纸巾售卖机调用“有 2 元钱”状态的方法即可。 void ejectQuarter()定义了一个“退币”的方法:在有 2 元钱的状态下,用户按下“退币”按钮,纸巾售卖机将此时的状态
11、改为“没有投币”状态,故直接调用 getNoQuarterState()即可。 根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量仍大于 O 时,将返回“没有投币”状态,同第(3)小题的分析,此处应调用 getNoQualterState()。 根据纸巾售卖机状态图可知,当售出纸巾,并且纸巾数量等于 0 时,将返回“纸巾售完”状态,此处用了ifelse 判断语句,当纸巾数量仍大于 0 时,返回“没有投币”状态,否则,纸巾数量一定等于 0,本段程序第五空是 else 下的一条语句,故此处是判断 count 为 0 时,纸巾售卖机的状态,显然,应调用getSoldOutState()。三、试题三(
12、总题数:1,分数:20.00)3.阅读下列说明和 C+代码,将应填入_处的字句写在下面。 说明 某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图 1 所示。现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中添加新的餐饮形式,得到如图 2 所示的类图,其中MenuComponent 为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类 Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图 1 中的甜点菜单,类 MenuItem 表示菜单中的菜式。 图 1 菜单结构图(
13、分数:20.00)_正确答案:()解析:virtual void add(MenuComponent*menuComponet)=0 MenuComponet* nemuComponets-push_back(menuComponent) (*iter) allMenus 解析 MenuComponent 是虚基类,其中要定义添加新菜单纯虚函数,函数体在其派生类Menultem 和 Menu 中现。第一个空处应填入:virtual void add(MenuComponent*menuComponet)=0。 在类 Menu 定义了列表 menuComponets,用于保存添加的新菜单,由st
14、d:listMenuComponent*:iteratoriter 可知列表的类型为 MenuComponent*,故第二个空处应填入:MenuComponet*。 添加菜单时,可以从 menuComponets 列表的前面添加,也可以从 menuComponets 列表的后面添加,但通过菜单的输出函数可知,菜单是从列表的后面添加的,因此第三个空处应填入:nemuComponets-push back(menuComponent)。 iter 是迭代器,用于遍历菜单列表 menuComponets,第四个空处应填入(*iter)。 在主函数,打印饭店所有菜单信息的函数调用为:allMenus-
15、print()。四、试题四(总题数:1,分数:20.00)4.阅读下列说明和 Java 代码,将应填入_处的字句写在下面。 说明 某灯具厂商欲生产一个灯具遥控器,该遥控器具有 7 个可编程的插槽,每个插槽都有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌灯具的开关,现采用 Command(命令)模式实现该遥控器的软件部分,Command 模式的类图如下图所示。 (分数:20.00)_正确答案:()解析:interface Command light.on() light.off() onCommandsslot offCommandsslot onCommandss
16、lot.execute() offCommandsslot.execute() 解析 本题考查 Command 命令模式的概念及应用,并用 Java 语言实现,Command 命令模式是一种对象行为模式。它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题,将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,以及支持可撤销的操作。五、试题五(总题数:1,分数:20.00)5.阅读下列说明和 Java 代码,将应填入_的字句写在下面。 说明 某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据,当获取到最新的环
17、境测量数据时,显示的环境数据能够更新现在采用观察者(observer)模式来开发该系统,观察者模式的类图如下图 2 所示。 (分数:20.00)_正确答案:()解析:Subject observer.update(temperature,humidity,cleanness) notifyObservers() measurementsChanged() Observer() envData.registerObserver(this) 解析 EnVironmentData 是环境数据,也就是我们要监测的对象,即主题(Subject),因此第一处为 Subject,第二处为通知观察者,因此遍历观察者容器,遍历到一个观察者对象,则更新该观察者的数据,即调用观察者的 update()方法,当环境数据变化时,需要通知观察者,因此第四处是调用环境变化方法 measurementsChanged(),通过此方法通知观察者更新数据,因此,第三处为 notifyObservers()。 根据 CurrentconditionsDisplay 类中的 update()方法可知:CurrentconditionsDisplay 是个观察者,因此第五处为 Observer,第六处是将观察者添加到主题中去。