1、软件水平考试中级软件设计师下午应用技术(面向对象技术)模拟试卷 1及答案与解析 一、必答题(共 4道大题,每道大题 15分) 0 阅读下列说明和图,回答问题 1至问题 3,将解答填入答题纸的对应栏内。 【说明】 Pay 类的提前引用 C1ass Statepublic: virtual void insertQuarter()=0; 投币 virtual void ejectQuarter()=0; 退币 virtual void turnCrank()=0; 按下 “出纸巾 ”按钮 virtusl void dispense()=0; 出纸巾 ; *类 SoidOutState、 NoQua
2、rterState、 HasQuarterState、 SoldState的定义省略,每个类中均定义了私有数据成员 TissueMachine*tissueMachine* class TiSsueMachineprivate: _(1)*soldOutState, *noQuarterState,*hasQuarterState, *soldstate, *state; int count; 纸巾数 public: TissueMachine(int number); void setState(State*state); State* qetHasQuarterState(); State
3、* qetNoQuarterState(); State* qetSoldState(); State* getSoldOutState(); int getCount(); 其余代码省略 ; 以下为类的实现部分 void NoQuarterState: insertQuarter() tissueMachine- setState_(2); void HasQuarterstate: ejectQuarter()( tissueMachine- setState_(3); void SoldState: dispense() if(tissueMachine- getC0unt() 0) t
4、issueMachine-setState_(4); else tissueMachine- setState_(5); 其余代码省略 5 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 某大型商 场内安装了多个简易的纸巾售卖机,自动售出 2元钱一包的纸巾,且每次仅售出一包纸巾。纸巾售卖机的状态如图 10 37所示。采用状态 (State)模式来实现该纸巾售卖机,得到如图 10 38所示的类图。其中类 State为抽象类,定义了投币、退币、出纸巾等方法接口。类 SoldState、 SoldOutState、NoQuarterState和 HasQuar
5、terState分别对应图 10 37中纸巾售卖机的 4种状态:售出纸巾、纸巾售完、没有投币、有 2元钱。【 Java代码】 Import java util *interface State public void insertQuarter(); 投币 public void ejectQuarter(); 退币 public void turnCrank(); 按下 “出纸巾 ”按钮 public void dispense(); 出纸巾 class TisSueMachime _(1)soldOutState,noQuarterstate, hasQuarterState, soldS
6、tate, state; State=soldOutState; int count=0; 纸巾数 public TissueMachine(int number) *实现代码省略 * public State getHasQuarterState() return hasQuarterState, public State getNOQuarterState() return noQuarterState; public State getSoldState()return soldState; public State getSoldOutState() return SoldOutSta
7、te; int getCount(return count; 其余代码省略 ; Class NoQuarterState implement State TiSsueMachime tiSsueMachime; publiC void insertQuarter() tiSsueMachine SetState(_(2); 构造方法以及其余代码省略 Class HasQuarterState implement State TiSsueMachine tiSsueMachine; public void ejectQuarter() tissueMachine setState_(3); 构造
8、方法以及其余代码省略 Class SoldState implement State TissueMachine tissueMachine; public Void dispense() if(tissueMachine getCount() 0) tissueMachine setstate_(4); else tissueMachine setstate(_(5) ); 5 阅读下列说明和图,回答问题 1至问题 3,将解答填入答题纸的对应栏内。 【说明】 一个简单的图形编辑器提供给用户的基本操作包括:创建图形、创建元素、选择元素以及删除图形。图形编辑器的组成及其基本功能描述如下。 (1)
9、图形由文本元素和图元元素构成,图元元素包括线条、矩形和椭圆。 (2)图形显示在工作空间中,一次只能显示一张图形 (即当前图形, current)。 (3)编辑器提供了两种操作图形的工具:选择工具和创建工具。对图形进 行操作时,一次只能使用一种工具 (即当前活动工具, active)。 创建工具用于创建文本元素和图形元素。 对于显示在工作空间中的图形,使用选择工具能够选定其中所包含的元素,可以选择一个元素,也可以同时选择多个元素。被选择的元素成为当前选中元素 (selected)。 每种元素都具有相应的控制点。拖曳选定元素的控制点,可以移动元素或者调整元素的大小。 现采用面向对象方法开发该图形编
10、辑器,使用 UML进行建模。构建出的用例图和类图分别如图 10 39和图 10 40所示。6 根据说明中的描述,给出图 10 39中 U1和 U2所对应的用例,以及 (1)和 (2)处所对应的关系。 7 根据说明中的描述,给出图 10 40中缺少的 C1 C8所对应的类名以及 (3) (6)处所对应的多重度。 8 图 10 40中的类图设计采用了桥接 (Bridge)设计模式,请说明该模式的内涵。 9 阅读下列说明和 C+代码,将应填入 (n)处的字句写在答题纸的对应栏内 ? 【说明】 某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图 10 41所示。 现在采用组合 (Composit
11、ion)模式来构造该饭店的菜单,使得饭店可以方便地在其 中添加新的餐饮形式,得到如图 10 42所示的类图。其中 MenuComponent为抽象类,定义了添加 (add)新菜单和打印饭店所有菜单信息 (print)的方法接口。类 Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图 10 41中的甜点菜单。类 Menultem表示菜单中的菜式。【 C+代码】 #include iostream #include list #include string using namespace std; class MenuC0mponentprot
12、ected: string name; public: MenuComponent(String name)this- name=name; sting getName()return name; _(1); 添加新菜单 virtual void print()=0; 打印菜单信息 ;class MenuItem: public MenuComponentprivate: double price;public: MenuItem(string name, double price): MenuComponent(name)this-price=price; double getPrice()
13、return price; void add(MenuComponent*menuComponent)return; 添加新菜单 void print()(tout getName() , getPrice end1;; Class Menu: public MenuComponentprivate: list _(2) menuComponents; public: Menu(string name): MenuComponent(name) void add(MenuComponent*menuComponent) 添加新菜单 _(3); void print() cout n getNa
14、me() n- end1; std: list 10 阅读下列说明和 Java代码,将应填入 (n)处的字句写在答题纸的对应栏内。 【说明】 某 饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图 10 43所示。 现在采用组合 (Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中添加新的餐饮形式,得到如图 10 44所示的类图。其中 MenuComponent为抽象类,定义了添加 (add)新菜单和打印饭店所有菜单信息 (print)的方法接口。类 Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图 10 43中
15、的甜点菜单。类 MenuItem表示菜单中的菜式。【 Java代码】 import java util *_(1) MenuComponent protected String name; _(2);添加新菜单 public abstract void print(); 打印菜单信息 public String getName()return name; class MenuItem extends MenuC0mponent private double price; public MenuItem(String name, double price) this name: name; th
16、is price=price; public double getPrice()return price; public void add(MenuComponent menuComponent)return ;添加新菜单 public void print() System out print( +getName(); class Menu extends MenuComponent private List MenuComponentmenuComponents=new ArrayList MenuComponent (); public Menu(String name)this nam
17、e=name; public void add(MenuComponent menuComponent) menuComponents _(3); public void print() System out print( n+getName(); System out println(, +-“); Iterator iterator=menuComponents iterator(); while(iterator hasNext() MenuComponent menuComponent=(MenuComponent)iterator next(); _(4); class MenuTe
18、stDrive public static void main(String args) MenuComponent al1Menus=new Menu(ALL MENUS); MenuComponent dinerMenu=new Menu(DINER MENU); 创建更多的 Menu对象,此处代码省略 allMenus add(dinerMenu); 将 dinerMenu添加到餐厅菜单中 为餐厅增加更多的菜单,此处代码省略 _(5);打印饭店所有菜单的信息 软件水平考试中级软件设计师下午应用技术(面向对象技术)模拟试卷 1答案与解析 一、必答题(共 4道大题,每道大题 15分) 【知识
19、模块】 面向对象技术 1 【正确答案】 U1:使用常规卡行驶 U2:使用单次卡行驶 (1) extend 【试题解析】 UML用例图中有包含 (include)、扩展 (extend)和泛化(generallization)三种关系。 包含关系:使用包含 (Inclusion)用例来封装一组跨越多个用例的相似动作 (行为片断 ),以便多个基 (Base)用例复用。基用例可以依赖包含用例执行的结果,但是双方都不能访问对方的属性。 扩展关系:将基用例中一段相对独立并且可选的动作,用扩展 (Extension),用例加以封装,再让它从基用例中声明的扩展点 (Extension Point)上进行扩展
20、,从而使基用例行为更简练和目标更集中。扩展用例为基用例添加新的行为。扩展用例可以访问基用例的属性,因此它能根据基用例中扩展点的当前状态来判断自己是否执行。但是扩展用例对基用例不可见。对于一个扩展用例,可以在基用例上有几个扩展点。 泛化关系:子用例和父用例相似,但表现出更特别的行为;子用例将继承父用例的所有结构、行为和关系。子用例可以使用父用例的一段行为,也可以重载它。父用例通常是抽象的。在实 际应用中很少使用泛化关系,子用例中的特殊行为都可以作为父用例中的备选流存在。 本题中,系统提供了 3种行驶卡:常规卡、季卡和单次卡。其中,季卡和单次卡都是预付卡。季卡的使用流程与常规卡类似,但是不需要打印
21、费用单,系统自动从卡中扣除应付费用,即 “使用季卡行驶 ”是 “使用常规卡行驶 ”的子用例,因此U1为 “使用常规卡行驶 ”。单次卡的使用流程与季卡类似,但还需要在行程的起点和终点上检查行驶路线是否符合该卡所规定的行驶路线,即 “使用单次卡行驶 ”扩展了原来的用例 “使用季卡行驶 ”,因此 U2为 “使用单次卡行驶 ”,空 (1)处应填 “ extend ”。 【知识模块】 面向对象技术 2 【正确答案】 C1: RoadSegment C2: Trajiectory C3: Card C4: RegularCard C5: PrepaidCard C6: MinitripCard (2)1
22、(3)1 3 【试题解析】 每个路段由两个地理位置坐标点 (Node)标定,行程 (Trajectory)由一组连续的路段构成,则 C1为 RoadSegment, C2为 Trajectory。行程的计算要通过读 取卡来获得,卡分为常规卡和预付费卡,预付费卡又分为季卡和单次卡,所以 C3 C6依次为 Card、 RegularCard、 PrepaidCard和 MinitripCard。 关联的多重度是指一个类的实例能与另一个类的多少个实例相关联。一个客户可以有不同类型的卡,而每一张卡只能属于一个用户,也就是说一个 Customer类实例可以与 Card类的 3个实例相关联,而一个 Car
23、d类实例只能和一个 Customer类实例相关联。 【知识模块】 面向对象技术 3 【正确答案】 RoadSegment的属性: Distance Trajectory的属性: Entry、 Exit、 DateOfEntry Card的属性: UnitPrice、 ValidPeriod 【试题解析】 里程数是每个路段 (RoadSegment)的关键属性;行程有起点 (Entry)和终点 (Exit),在进入行程起点时,系统还要记录进入时间,那么行程 (Trajectory)的关键属性有 Entry、 Exit、 DateOfEntry;卡有 3种类型,不同的卡有不同的有效期 (Valid
24、 Period)和里程单价 (Unit Price),所以 Card的 关键属性有 UnitPrice、ValidPeriod。 【知识模块】 面向对象技术 4 【正确答案】 (1)State (2)tissueMachine- getHasQuarterState0或 new HasQuarterState() (3)tissueMachine- getNoQuarterState0或 new NoQuanerState() (4)tissueMachine- getNoQuarterState0或 new NoQuarterState() (5)tissueMachine- getSold
25、outState()或 new SoldOutState() 【试题解析】 空 (1):根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。 State定义了纸巾售卖机所对应的一些状态,如售出纸巾、纸巾售完等。类 SoldOutState、 NoQuarterState、HasQuarterState、 SoldState均由类 State派生而来。 空 (2): void insertQuarter()定义了一个 “投币 ”的方法,即在 “没有投币 ”状态下,用户投币 的方法。 tissureMachine- setState是改变纸巾售卖机的状态,此时,用户
26、已投入 2元钱,故将此时的状态改为 “有 2元钱 ”的状态,纸巾售卖机调用 “有 2元钱 ”状态的方法即可。 空 (3): void ejectQuarter()定义了一个 “退币 ”的方法,即在 “有 2元钱 ”状态下,用户按下退币按钮,纸巾售卖机将此时的状态改为 “没有投币 ”状态,故直接调用getNoQuarterState()即可。 空 (4):根据纸巾售卖机状态图可知,当售出纸巾并且纸巾数量仍大于 0时,将返回 “没有投币 ”状态。 同空 (3)的分析,此处应调用 getNoQuarterState()。 空 (5):根据纸巾售卖机状态图可知,当售出纸巾并且纸巾数量等于 0时,将返回
27、 “纸巾售完 ”状态。此处用了 ifelse 判断语句,当纸巾数量仍大于 0时,返回“没有投币 ”状态,否则,纸巾数量一定等于 0。空 (5)处是 else下的一条语句,故此处是判断 count为 0时纸巾售卖机的状态,显然应调用 getSoldOutState()。 【知识模块】 面向对象技术 5 【正确答案】 (1)State (2)tissueMachine getHasQuarterState()或 new HasQuarterState()或tissueMachine HasQuarterState() (3)tissueMachine getNoQuarterState()或 ne
28、w NoQuarterState()或tissueMachine NoQuarterState() (4)tissueMachine getNoQuarterState()或 new NoQuarterState()或tissueMachine NoQuarterState() (5)tissueMachine getSoldOutState()或 new SoldOutState()或tissueMachine SoldOutState() 【试题解析】 空 (1):根据题意,本题使用的是状态模式,判断纸巾售卖机的状态,根据不同的状态执行不同的动作。 State定义了纸巾售卖机所对应的一些状
29、态,如售出纸巾、纸巾售完等。类 SoldOutState、NoQuarterState、 tasQuarterState、 SoldState均由类 State派生而来。 空 (2): public void insertQuarter()定义了一个 “投币 ”的方法,即在 “没有投币 ”状态下,用户投币的方法。 tissureMachine setState是改变纸巾售卖机的状态,此时,用户已投入 2元钱,故将此时的状态改为 “有 2元钱 ”的状态,纸巾售卖机调用 “有 2元钱 ”状态的方法即可。 空 (3): public void ejectQuarter()定义了一个 “退币 ”的方法
30、,即在 “有 2元钱 ”状态下,用户按下退币按钮,纸巾售卖机将此时的状态改为 “没有投币 ”状态,故直接调用 NoQuarterState()即可。 空 (4):根据纸巾售卖机状态图可知,当售出纸巾并且纸巾数量仍大于 0时,将返回 “没有投币 ”状态。同空 (3)的分析,此处应调用 NoQuarterState()。 空 (5):根据纸巾售卖机状态图可知,当售出纸巾并且纸巾数量等于 0时,将返回 “纸巾售完 ”状态。此处用了 ifelse 判断语句,当纸巾数量仍大于 0时,返回“没有投币 ”状态,否则,纸巾数量一定等于 0。空 (5)处是 else下的一条语句,故此处是判断 count为 0时
31、纸巾售卖机的状态,显然应调用 SoldOutState()。 【知识模块】 面向对象技术 【知识模块】 面向对象技术 6 【正确答案】 U1:移动元素 U2:调整元素的大小 注: U1和 U2的答案可以互换 【试题解析】 由 “被选择的元素成为当前选中元素 ”、 “每种元素都具有相应的控制点。拖曳选定元素的控制点,可以移动元素或者调整元素的大小 ”可知, U1和U2分别为 “移动元素 ”和 “调整元素的大小 ”。用例 U1和 U2是对 “选择元素 “用例的功能扩展,因此空 (1)处和空 (2)处都应填入 “ extend ”。 【知识模块】 面向对象技术 7 【正确答案】 C1:创建工 具 C
32、2:选择工具 C3:线条 C4:矩形 C5:椭圆 C6:线条 C7:矩形 C8:椭圆 注: C3 C5的答案可以互换; C6 C8的答案可以互换 【试题解析】 图形中包括文本元素和图元元素,图元元素又包括线条、矩形和椭圆。所以 C6 C8依次为线条、矩形、椭圆,三者顺序可以颠倒。工具有两种:选择工具和创建工具。创建工具用于创建文本元素和图形元素;使用选择工具能够选定其中所包含的元素。类图中 C2和元素类关联,且通过 C2可以调整元素的大小,因此 C2为选择工具,则 C1为创建工具。 C3 C5依次为线条、矩形、椭圆,顺序可以颠倒。 多重度有以下几种。 0 1:表示 0或 1个实例。 n m:表
33、示表示有 n m个实例。 0 *或者 *:表示没有实例个数的限制 (包括没有实例 )。 1:表示只有一个实例。 1 *:表示最少一个实例。 编辑器提供了两种操作图形的工具,但一次只能使用一种工具,当然也可以不选用工具,因此 (3)处为 0 1, (4)处为 1。图形由文本元素和图元元素构成,图形中至少要包含一种元素,因此 (5)处为 1, (6)处为 1 *。 【知识模块】 面向对象技术 8 【正确答案】 桥接模式将抽象部分和它的实现部分分离,使它们都可以独立地变化,对一个抽象的实现部分的修改应该对使用它的程序不产生影响。 【试题解析】 桥接模式用于将抽象部分与实现部分分离,使它们都可以独立地
34、变化。该模式使用 “对象问的组合关系 ”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。 【知识模块】 面向对象技术 9 【正确答案】 (1)virtual void add(MenuComponent*menuComponent)=0 (2)MenuComponent* (3)menuComponents- push_back(menuComponent) (4)(*iter) (5)allMenus 【试题解析】 MenuComponent是虚基类,其中要定义添加新菜单纯虚函数,函数体在其派生类 Menultem和 Menu中实现。空 (1)处应填入 virtu
35、al void add(MenuComponent*menuComponent)=0。 在类 Menu中定义了列表 menuComponents,用于保存添加的新菜单,由std: list MenuComponent*: iterator iter可知列表的类型为MenuComponent*,故空 (2)处应填入 MenuComponent*。 添加菜单时,可以从 menuComponents列表的前面添加,也可以从menuComponents列表的后面添加,但通过菜单的输出函数可知,菜单是从列表的后面添加的,因此空 (3)处应填入 menuComponents-push_back(menuC
36、omponent)。 iter是迭代器,用于遍 历菜单列表 menuComponents,空 (4)处应填 A (*iter)。 在主函数,打印饭店所有菜单信息的函数调用为 allMenus- print()。 【知识模块】 面向对象技术 10 【正确答案】 (1)abstract class或 public abstract class (2)public abstract void add(MenuComponent menuComponent)或 abstract void add(MenuComponent menuComponent)或 protected abstract void
37、 add(MenuComponent menuComponent) (3)add(menuComponent) (4)menuComponent print() (5)allMenus print() 【试题解析】 组合模式将对象组合成树形结构以表示 “整体一部分 ”的层次结构,其中的组合对象使得用户可以组合基元对象以及其他的组合对象,从而形成任意复杂的结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式的结构如图 10 46所示。 图中各部分说明 如下。 类 Component为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为,声明一个接口用于访问和管理
38、Component的子部件。 类 Leaf在组合中表示叶节点对象,叶节点没有子节点,并在组合中定义图元对象的行为。 类 Composite定义有子部件的那些部件的行为,存储子部件,并在 Component接口中实现与子部件有关的操作。 类 Client通过 Component接口操纵组合部件的对象。下列情况可以使用组合模式。 表示对象的整体一部分层次结构。 希望用户忽略组合对象与单个对象的不同, 用户将统一地使用组合结构中的所有对象。 本试题将组合模式应用到饭店菜单的构造中。图 10 44中的类MenuComponent对应图 10 46中的 Component, Menultem对应 Lea
39、f, Menu对应 Composite。在实现时,通常都会把 Component定义为抽象类。 在 Java中,用 abstract关键字限定的类即为抽象类,所以空 (1)处应填入 abstract class。根据注释,空 (2)处应该定义功能为 “添加新菜单 ”的成员函数。在子类 MenuItem和Menu中都可以看到 add成员函数,说明 子类中重置了父类中的成员函数。所以空(2)处应填入 public abstract void add(MenuComponent menuComponent)。 由图10 44可以看出, Menu中包含了 MenuComponent的对象集合。程序中用
40、 Java中的 list来实现这个聚合关系,这样就可以利用 list中提供的各种方法了。 list中用于添加元素的方法是 add,所以空 (3)处应填入 add(menuComponent)。 空 (4)处出现在方法 print中,其功能是打印出所有菜单的信息。这里使用了 list中的 迭代器类 iterator遍历每个子菜单,并调用子菜单中定义的 print方法打印该子菜单的信息。空 (4)处应填入 menuComponent print()。 为了能够在 main中打印出所有的菜单信息,必须使用表示菜单结构中最项层菜单的对象来调用 print,因此空 (5)处应填入 allMenus print()。 【知识模块】 面向对象技术