1、软件水平考试中级软件设计师上午基础知识(面向对象方法)模拟试卷 1及答案与解析 1 在面向对象技术中,有多种不同的多态形式,其中参数多态和 ( )称为通用多态。 ( A)重置多态 ( B)过载多态 ( C)隐含多态 ( D)包含多态 2 以下描述中,不正确的是 ( )。 ( A)类是对象的抽象,对象是类的实例 ( B)类是一组具有相同属性和方法的对象的集合 ( C)每个类都可以被实例化 ( D)对象是指一组属性及这组属性上的专用操作的封装体 3 在 UML的通用机制中, ( )是系统中遵 从一组接口规范且付诸实现的物理、可替换的软件模块。 ( A)包 ( B)类 ( C)接口 ( D)构件 4
2、 UML的事物是对模型中最具有代表性的成分的抽象, ( )是模型的动态部分,描述了跨越时间和空间的行为。 ( A)结构事物 ( B)分组事物 ( C)行为事物 ( D)注释事物 5 下列有关面向对象方面的描述,不正确的是 ( )。 ( A)面向对象要求针对接口编程,而不要针对实现编程 ( B)接口与实现不可分割 ( C)设计职责单一的类 ( D)尽量使用已有的类库 6 已知两个类 O、 P,类 0中定义了一个私有方法 F1和一个公有方法 F2;类 P中定义了一个公有方法 F3,类 P为类 O的派生类。它们的继承方式如下所示。 class P: private O ; 在关于类 P的描述中正确的
3、是 ( )。 ( A)类 P的对象可以访问 F1,但不能访问 F2 ( B)类 P的对象可以访问 F2,但不能访问 F1 ( C)类 P的对象既可以访问 F1,也可以访问 F2 ( D)类 P的对象既不能访问 F1,也不能访问 F2 7 下来关于面向对象分析和设计的描述中,错误的是 ( )。 ( A)组织并确定对象关系是面向对象设计阶 段的活动 ( B)发现并确定业务对象是面向对象分析阶段的活动 ( C)建模系统功能是面向对象分析阶段的活动 ( D)确定对象间的通信方式是面向对象设计阶段的活动 8 已知 f1, f2是同一个类的两个成员函数,但 f1不能调用 f2,说明 ( )。 ( A) f
4、1、 f2都是静态成员函数 ( B) f1是静态成员函数, f2不是静态成员函数 ( C) f1不是静态成员函数, f2是静态成员函数 ( D) f1、 f2都不是静态成员函数 9 在 UML的 5大系统视图中, ( )是可执行线程和进程作为活动类的建模。 ( A)逻辑视图 ( B)进程视图 ( C)部署视图 ( D)用例视图 10 以下关于 C+中构造函数和析构函数的描述中,错误的是 ( )。 ( A)构造函数的函数名必须与类名相同 ( B)构造函数的返回类型是 void类型 ( C)析构函数无形参,也不可被重载 ( D)一个类只能有一个析构函数,但可以有多个构造函数 11 某 ATM自动取
5、款机系统中, “查询余额 ”和 “取现 ”两个用例都需要检查用户的验证码是否正确,为此定义一个通用的用例 “核查验证码 ”。那么用例 “查询余额 ”和“取现 ”与用例 “核查验证码 ”之间 是 ( )。 ( A)包含关系 ( B)扩展关系 ( C)泛化关系 ( D)关联关系 12 在 UML的建模机制中, ( )描述了对象之间动态的交互关系,还描述了交互的对象之间的静态链接关系,即同时反映系统的动态和静态牲。 ( A)活动图 ( B)顺序图 ( C)状态图 ( D)协作图 13 在常见的 UML图中,下列属于结构性视图的是 ( )。 对象图 用例图 包图 定时图 构件图 部署图 类图 状态图
6、( A) ( B) ( C) ( D) 14 遵守面向对象设计原则可以有效地提高系统的复用性和可维护性。应用 ( )原则可扩展已有的系统,并为之提供新的行为。 ( A)开闭 ( B)里氏替换 ( C)依赖倒置 ( D)接口隔离 15 以下关于设计模式的描述中,不正确的是 ( )。 ( A)使用设计模式的主要目的是复用成功的设计和体系结构 ( B)设计模式具有适应需求变化的优点 ( C)设计模式可以改善代码的平台可移植性 ( D)设计模式可以减少方案出错的可能性 16 ( )主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为。 ( A)边界类 ( B)存储类 ( C)抽象类 (
7、 D)实体类 17 ( )使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ( A) Adapter(适配器 ) ( B) Iterator(迭代器 ) ( C) Prototype(原型 ) ( D) Observer(观察者 ) 18 ( )是指同一个操作作用于不同的对象可以有不同的解释,产生不同的执行结果。 ( A)封装 ( B)泛化 ( C)继承 ( D)多态 19 有两个类 X和 Y,那么以下描述中,不正确的是 ( )。 ( A)修改 X会引起 Y的变化,那么 X和 Y是一种依赖关系 ( B) X表示一般,而 Y表示特殊,那么 X和 Y是一种泛化关系 ( C) X是整体,
8、Y是部分,且 X和 Y同生命周期,那么它们是组合关系 ( D) X是整体, Y是部分,且 X和 Y同生命周期,那么它们是聚合关系 20 ( )除了提供可被应用程序调用的类以外,还基本实现了一个可执行的架构。 ( A)框架 ( B)标准库 ( C)函数库 ( D)类库 21 当 ( )时,用例是捕获系统需求 最好的选择。 ( A)系统具有很少的用户 ( B)系统具有很少的接口 ( C)系统算法复杂,功能单一 ( D)系统有很多参与者 22 UML中接口可用于 ( )。 ( A)提供构造型 (stereotype)名称为 (terrace)的具体类 ( B) Java和 C+程序设计中,而 C#程
9、序设计中不支持 ( C)定义可以在多个类中重用的可执行逻辑 ( D)声明对象类所需要的服务 23 下列模式中,属于行为模式的是 ( )。 ( A)原型模式 ( B)访问者模式 ( C)桥接模式 ( D)以上都 不是 24 对于场景:一个公司负责多个项目,每个项目 (Project)由一个员工 (Employee)团队 (Team)来开发。下列 UML概念图中, ( )最适合描述这一场景。 ( A)图 A ( B)图 B ( C)图 C ( D)图 D 25 在面向对象技术中,对象具有以下特性: ( )。 清晰的边界 良好定义的行为 确定的位置和数量 可扩展性 ( A) ( B) ( C) (
10、D) 26 UML序列图是一种交互图,描述了系统中对象之间传递消息的时间次序。其中,异步消息与 同步消息不同,异步消息并不引起调用者终止执行而等待控制权的返回。图 5-2中 ( )分别表示一条同步消息和一条异步消息。 ( A) 1和 4 ( B) 2和 3 ( C) 1和 3 ( D) 2和 4 26 (1)设计模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。图5 1为该设计模式的类图,其中, (2)用于定义实现部分的接口。 27 (1) ( A) Singleton(单件 ) ( B) Bridge(桥接 ) ( C) Composite(组合 ) ( D) Facade(外观
11、) 28 (2) ( A) Abstraction ( B) ConcretelmplementorA ( C) ConcretelmplementorB ( D) Implementor 28 (1)设计模式可以动态地给一个对象增加其他职责,而且这种方式比生成子类实现更为灵活。图 5 3所示为该设计模式的类图,其中, (2)是装饰抽象类,维护一个内有的 Component。 29 (1) ( A) Flyweight(享元 ) ( B) Proxy(代理 ) ( C) Strategy(策略 ) ( D) Decorator(装饰 ) 30 (2) ( A) Component ( B) C
12、oncreteComponent ( C) Decorator ( D) Concrete DecoratorA 软件水平考试中级软件设计师上午基础知识(面向对象方法)模拟试卷 1答案与解析 1 【正确答案】 D 【试题解析】 在面向对象技术中,对象在收到消息后要予以响应,不同的对象收到同一消息可产生完全不同的结果,这一现象称为多态。多态有多种不同的形式,其中参数多态和包含多态称为通用多态,过载多态和强制多态成为特定多态。 参数多态应用比较广泛,被称为最纯的多 态。这是因为同一对象、函数或过程能以一致的形式用于不同的类型。包含多态最常见的例子就是子类型化,即一个类型是另一类型的子类型。过载多态
13、是同一变量被用来表示不同的功能,通过上下文以决定一个类所代表的功能。即通过语法对不同语义的对象使用相同的名,编译能够消除这一模糊。强制多态是通过语义操作把一个变元的类型加以变换,以符合一个函数的要求,如果不做这一强制性变换将出现类型错误。类型的变换可在编译时完成,通常是隐式地进行,当然也可以在动态运行时来做。 2 【正确答案】 C 【试题解析】 本题主要考查类和对象 的概念。 在计算机系统中,对象是指一组属性及这组属性上的专用操作的封装体,它由对象标识 (名称 )、属性 (状态、数据、成员变量,也可以是另一个对象 )和服务 (操作、行为、方法 )三个要素组成。对象是系统中用来描述客观事物的一个
14、实体,它们被封装为一个整体,以接口的形式对外提供服务。 而类是一组具有相同属性和方法的对象抽象。一个类中的每个对象都是这个类的一个实例。在系统分析和设计时,通常要把注意力集中在类上,而不是具体的对象上。每个类一般都有实例,没有实例的类是抽象类。抽象类不能被实例化 (不能用 new关键字去产 生对象 ),抽象方法只需声明,而无须实现。是否建立了丰富的类库是衡量一个 00程序设计语言成熟与否的重要标志之一。 3 【正确答案】 D 【试题解析】 在 UML中,把组织模型的组块称为包。包是用于把元素组织成组的通用机制,有助于组织模型中的元素,使得对它们的理解变得更容易,也使得用户能够控制对包的内容的访
15、问,从而控制系统体系结构中的接缝。 接口是描述某个类或构件的一个服务操作集。也就是说,接口是类或构件对其他类或构件提供的功能、操作、行为。 构件是系统中遵从一组接口且提供实现的物理、可 替换的部分。可以利用构件为可能存在于结点上的物理事物 (如可执行体、库、表、文件及文档等 )进行建模。一般情况下,构件表示将类、接口和协作等逻辑元素打包而形成的物理模块。好的构件应采用定义良好的接口来定义灵活的抽象,以便将来可以用更新且接口兼容的构件来替换较旧的构件。 4 【正确答案】 C 【试题解析】 本题考查面向对象建模语言中的事物概念。 在 UML中,有 4种事物: (1)结构事物是 UML模型中的名词。
16、它们通常是模型的静态部分,描述概念或物理元素。 (2)行为事物是 UML模型 的动态部分。它们是模型中的动词,描述了跨越时间和空间的行为。 (3)分组事物是 UML模型的组织部分。它们是一些由模型分解成的 “盒子 ”。 (4)注释事物是 UML模型的解释部分。这些注释事物用来描述、说明和标注模型的任何元素。 5 【正确答案】 B 【试题解析】 本题主要考查面向对象的基本知识。 “针对接口编程,而不是针对实现编程 ”是面向对象设计的 7大原则之一,遵循此原则有以下几个方面的好处。 (1)使用者不必知道其使用对象的具体所属类。 (2)使用者无须知道特定类,只 需知道它们所期望的接口。 (3)一个对
17、象可以很容易地被 (实现了相同接口的 )另一个对象所替换。 (4)对象间的连接不必硬绑定到一个具体类的对象上,因此增加了灵活性。 另外,在这种方式下,接口与实现是可以分割的,这样利于变化,也符合面向对象的根本意图 (便于需求的改变 )。 设计职责单一的类也是 7大设计原则中的一个,因为如果一个类有一个以上的职责,这些职责就耦合在了一起,这会导致脆弱的设计。比如,当一个职责发生变化时,就可能会影响其他的职责。另外,多个职责耦合在一起,也会影响程序的复 用性。 类库,简单地说,就是很多类的集合,而这些类都是已经定义好的了,在编程时,可以直接使用,使用类库的好处主要有两个:一个是可以减少出差的概率;
18、另外一个是可以节省大量的时间和经历。因此,如果有类库可供使用,肯定是要尽量使用已有的类库。 6 【正确答案】 D 【试题解析】 本题主要考查继承中的一些基本知识。 在 C+中,类的继承主要有如下 3种方式: (1)公有继承 (public)。公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。因 此在公有继承时,派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员。 (2)私有继承 (private)。私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
19、 (3)保护继承 (protected)。保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。 总的来说,基类成员对派生类的对象来说,是否能被访问,就要看基类的成员在派生类中变成了什么类型的 成员。例如,私有继承时,基类的公有成员和私有成员都变成了派生类中的私有成员,因此对于派生类中的对象来说基类的公有成员和私有成员就是不可见的。 在本题中,由于类 P是对类 O的私有继承,因此将类 O的公有成员和私有成员都变成了派生类中的私有成员,因此类 P的对象无法访问 F1,也无法访问 F2。 7 【正确答案】 A 【试题
20、解析】 本题考查面向对象分析与设计的活动。 面向对象分析基于用例模型,通过对象建模记录确定的对象、对象封装的数据和行为以及对象之间的关系。面向对象分析包括 3个活动:建模系统功能,发现并且确定 业务对象,组织对象并确定其关系。 面向对象设计是在分析对象模型的基础上,设计各个对象、对象之间的关系 (如层次关系、继承关系等 )和通信方式 (如消息模式 )等,其主要作用是对 OOA的结果作进一步的规范化整理。 8 【正确答案】 B 【试题解析】 本题主要考查静态数据成员的内容。 类的静态成员与一般的类成员不同,静态成员与对象的实例无关,只与类本身有关。它们一般用来实现类要封装的功能和数据,但不包括特
21、定对象的功能和数据。静态成员和普通数据成员区别较大,体现在下面几点: (1)普通数据成员属 于类的一个具体的对象,只有对象被创建了,普通数据成员才会被分配内存。静态数据成员属于整个类,即使没有任何对象创建,类的静态数据成员变量也存在。 (2)外部访问类的静态成员只能通过类名来访问。 (3)类的静态成员函数无法直接访问普通数据成员 (可以通过类的指针等作为参数间接访问 ),而类的任何成员函数都可以访问类的静态数据成员。 (4)类的静态方法只能访问该类的静态数据成员。 另外,静态成员和类的普通成员一样,也具有 public、 protected、 private3种访问级别,也可 以具有返回值及被
22、修改等性质。 而在本题中,虽然 f1和 f2都是同一个类的成员函数,但 f1不能调用 f2,如果它们都是普通成员函数,那么肯定是可以调用;如果它们都是静态成员函数,也可以调用;如果 f1是静态成员函数,而 f2不是的话,那么这种情况下, n不能调用 f2;如果 f1不是静态成员函数,而 f2是的话,那么这种情况下, f1也能调用f2。 综上所述,可知本题的答案选 B。 9 【正确答案】 B 【试题解析】 UML对系统架构的定义是系统的组织结构,包括系统分解的组成部分,以及它们的关联性、交互 机制和指导原则等提供系统设计的信息。具体来说,就是指以下 5个系统视图: (1)逻辑视图。逻辑视图也称为
23、设计视图,表示设计模型中在架构方面具有重要意义的部分,即类、子系统、包和用例实现的子集。 (2)进程视图。进程视图是可执行线程和进程作为活动类的建模,是逻辑视图的一次执行实例,描述了并发与同步结构。 (3)实现视图。实现视图对组成基于系统的物理代码的文件和构件进行建模。 (4)部署视图。部署视图把构件部署到一组物理结点上,表示软件到硬件的映射和分布结构。 (5)用例视 图。用例视图是最基本的需求分析模型。 10 【正确答案】 B 【试题解析】 在定义一个对象的同时,希望能给它的数据成员赋初值 对象的初始化。在特定对象使用结束时,还经常需要进行一些清理工作。 C+程序中的初始化和清理工作分别由两
24、个特殊的成员函数来完成,它们就是构造函数和析构函数。 构造函数是与类名相同的,在建立对象时自动调用的函数。如果在定义类时,没有为类定义构造函数,编译系统就生成一个默认形式的隐含的构造函数,这个构造函数的函数体是空的,因此默认构造函数不具备任何功能。构造函数是类的一 个成员函数,除了具有一般成员函数的特征之外,还归纳出如下特殊的性质: (1)构造函数的函数名必须与定义它的类同名。 (2)构造函数没有返回值。如果在构造函数前加 void是错误的。 (3)构造函数被声明定义为公有函数。 (4)构造函数在建立对象时由系统自动调用。 析构函数也译作拆构函数,是在对象消失之前的瞬间自动调用的函数,析构函数
25、具有以下特点: (1)析构函数没有任何参数,不能被重载,但可以是虚函数,一个类只有一个析构函数。 (2)析构函数没有返回值。 (3)析构函数名与类名相同,但在类名前加上一个逻辑非运算符 “ ”,以示与构造函数对比区别。 (4)析构函数一般由用户自己定义,在对象消失时由系统自动调用,如果用户没有定义析构函数,系统将自动生成一个不做任何事的默认析构函数。 11 【正确答案】 A 【试题解析】 本题考查用例之间的基本关系。 用例之间存在 3种关系,分别是包含关系、扩展关系和泛化关系。 包含关系。当可以从两个或两个以上的用例中提取公共行为时,应该使用包含关系来表示它们。其中这个提取出来的公共用例称为抽
26、象用例,而把原 始用例称为基本用例或基础用例。包含关系的一个重要特征,就是被抽象出来的用例是基础用例必须的部分,不能或缺。本题的描述就是一个包含关系。 扩展关系。如果一个用例明显地混合了两种或两种以上的不同场景,即根据情况可能发生多种分支,则可以将这个用例分为一个基本用例和一个或多个扩展用例,这样使描述可能更加清晰。扩展关系的一个重要特征,就是抽取的用例相对于基础用例来说不是必须的。 泛化关系。当多个用例共同拥有一种类似的结构和行为的时候,可以将它们的共性抽象成为父用例,其他的用例作为泛化关系中的子用例。在 用例的泛化关系中,子用例是父用例的一种特殊形式,子用例继承了父用例所有的结构、行为和关
27、系。例如,某学员进行课程注册时,假设既可以通过现场注册,也可以通过网上注册,则 “注册课程 ”用例就是 “现场注册 ”用例和 “网上注册 ”用例的泛化。 12 【正确答案】 D 【试题解析】 本题主要考查 UML中的图,是考试中的一个重要知识点,这里重点要理解各种图的作用和特点。 在 UML 2 0包括 14种图,分别列举如下: (1)类图 (Class Diagram)。类图描述一组类、接口、协作和它们之间的关系。在OO系统的建模 中,最常见的图就是类图。类图给出了系统的静态设计视图,活动类的类图给出了系统的静态进程视图。 (2)对象图 (Object Diagram)。对象图描述一组对象及
28、它们之间的关系。对象图描述了在类图中所建立的事物实例的静态快照。和类图一样,这些图给出系统的静态设计视图或静态进程视图,但它们是从真实案例或原型案例的角度建立的。 (3)构件图 (Component Diagram)。构件图描述一个封装的类和它的接口、端口,以及由内嵌的构件和连接件构成的内部结构。构件图用于表示系统的静态设计实现视图。对 于由小的部件构建大的系统来说,构件图是很重要的。构件图是类图的变体。 (4)组合结构图 (Composite Structure Diagram)。组合结构图描述结构化类 (如构件或类 )的内部结构,包括结构化类与系统其余部分的交互点。组合结构图用于画出结构化
29、类的内部内容。 (5)用例图 (Use Case Diagram)。用例图描述一组用例、参与者及它们之间的关系。用例图给出系统的静态用例视图。这些图在对系统的行为进行组织和建模时是非常重要的。 (6)顺序图 (Sequence Diagram,序列图 )。顺序图是一种交互图 (Interaction Diagram),交互图展现了一种交互,由一组对象或参与者以及它们之间可能发送的消息构成。交互图专注于系统的动态视图。顺序图是强调消息的时间次序的交互图。 (7)通信图 (Communication Diagram)。通信图也是一种交互图,强调收发消息的对象或参与者的结构组织。该图反映了对象之间的
30、消息交互,与顺序图相似,但与顺序图不同的是,协作图不但描述了对象之间的交互还描述了交互的对象之间的链接关系,即通信图同时反映了系统的动态和静态特征。 在 UML 1 X版本中,通信图称为协作图 (Collaboration Diagram)。 (8)定时图 (Timing Diagram,计时图 )。定时图也是一种交互图,强调消息跨越不同对象或参与者的实际时间,而不仅仅只是关心消息的相对顺序。 (9)状态图 (State Diagram)。状态图描述一个状态机,由状态、转移、事件和活动组成。状态图给出了对象的动态视图。它对于接口、类或协作的行为建模尤为重要,而且它强调事件导致的对象行为,有助于
31、对反应式系统建模。 (10)活动图 (Activity Diagram)。活动图将进程或其他计算结构展示为计算内部一步步的控制流和数据流。活动图专注于系统的动态视图。它对系统的功能建模和业务流程建模特别重要,并强调对象间的控制流程。 (11)部署图 (Deployment Diagram)。部署图描述对运行时的处理结点及在其中生存的构件的配置。部署图给出了架构的静态部署视图,通常一个结点包含一个或多个部署图。 (12)制品图 ( Artifact Diagram)。制品图描述计算机中一个系统的物理结构。制品包括文件、数据库和类似的物理比特集合。 制品图通常与部署图一起使用。制品也给出了它们实现
32、的类和构件。 (13)包图 (Package Diagram)。包图描述由模型本身分解而成的组织单元,以及它们之间的依赖关系。 (14)交互概览图 (Interaction Overview Diagram)。交互概览图是活动图和顺序图的混合物。 综上所述,可知本题的答案选 D。 13 【正确答案】 C 【试题解析】 本题主要考查 UMIL图的分类。 UML2 0中的 14种视图可以分为结构性视图 (静态 )和行为性视图 (动态 )两种。结构领域 主要是对系统中的结构成员及其相互关系进行描述;而行为领域则描述了系统随时间变化的行为。 结构性视图包括类图、对象图、包图、组合结构图、构件图、部署图
33、和制品图,而行为性视图包括用例图、顺序图、通信图、定时图、状态图、活动图、交互概览图。其中顺序图、通信图、定时图和交互概览图又统称为交互图。 综上所述,可知本题答案选 C。 14 【正确答案】 A 【试题解析】 本题考查面向对象设计的设计原则。 面向对象设计有七大原则,分别是:单一职责原则、开放封闭原则、李氏替换原则、依赖倒置原则、接口隔离原则、组合重用原则和迪米特原则。下面我们分别简单介绍一下这些原则。 (1)单一职责原则 (SRP):就一个类来说,应该仅有一个引起它变化的原因。也就是说,一个类应该只有一个职责。如果有多个职责,那么就相当于把这些指责耦合在一起,一个职责的变化就可能削弱或抑制
34、了这个类完成其他职责的能力,引起类的变化的原因就会有多个。所以在构造一个类时,将类的不同职责分离至两个或多个类中 (或者接口中 ),确保引起该类变化的原因只有一个。 (2)开闭原则 (OCP):软件组成实体应该是可扩展的,但是不可修改。开放一封闭原则认为应该试图设计永远也不需要改变的模块。可以添加新代码来扩展系统的行为,不能对已有的代码进行修改。这个原则很好的实现了面向对象的封装性和可重用性。 (3)替换原则 (LSP):子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是 Liskov于 1987年提出的设计原则。它同样可以从 Bertrand Meyer的DBC(Design b
35、y Contract)的概念推出。以圆和椭圆为例,圆是椭圆的一个特殊子类。因此任何出现 椭圆的地方,圆均可以出现。但反过来就可能行不通。 运用替换原则时,尽量把类 B设计为抽象类或者接口,让 C类继承类 B(接口 B)并实现操作 A和操作 B,运行时,类 C实例替换 B,这样即可进行新类的扩展 (继承类 B或接口 B),同时无须对类 A进行修改。 (4)依赖倒置原则 (DIP):在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。在结构化设计中,可以看到底层的模块是对高层抽象模块的实现,这
36、说明,抽象的模块要依赖具体 实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个 “硬伤 ”。面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口。为此,在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类 (子类 )来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。 (5)接口分离原则 (ISP):采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。 ISP原则是另外一个支持诸如 COM等组件化的使能技术。缺少 ISP,组件、类的 可用性和移植性将大打折扣。这个原则的本质相
37、当简单。如果拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。 (6)组合重用原则:就是能用组合实现的地方,尽量用组合来实现,而不要使用继承来扩展功能,因为组合能更好地实现封装,比继承具有更大的灵活性和更稳定的结构。 (7)迪米特原则:指一个对象应该对于其他对象有最少的了解,这样做的好处就是可以有效地降低类之间的耦合要求。 15 【正确答案】 C 【试题解析】 此题考的是设计模式基本 概念,要求考生清楚设计模式的作用和特点。 模式是一种问题的解决思路,已经适用于一个实践环境,并且可以适用于其他环境。设计模式通常是对于某一
38、类软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的就在于要重用软件开发经验。 设计模式主要有以下几个方面的作用: (1)重用设计,重用设计比重用代码更有意义,它会自动带来代码重用。 (2)为设计提供共同的词汇,每个模式名就是一个设计词汇,其概念是的程序员间的交流更加方便。 (3)在开发文档中采用模式词汇可以让其他人更容易理解 你的想法和做法,编写开发文档也更加容易。 (4)应用设计模式可以让重构系统变得容易,可确保开发正确的代码,并降低在设计或实现中出现错误的可能。 (5)支持变化,可以为重写其他应用程序提供很好的系统架构。 (6)正确使用设计模式,可以节省大量时间。
39、另外,设计模式还有适应需求变化的优点,如职责链模式,当系统业务流程有变化时,只需要很少的调整即可达到目的。 16 【正确答案】 A 【试题解析】 本题主要考查类的分类。根据不同的作用,类可以分为边界类、抽象类、实体类三种,其中: 边界类描述的是系统外部环境和系统内部运作之间的交互,它工作在参与者和系统之间,而边界对象表示的为一个交互接口。 实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关,实体类独立于系统外部环境 (Actor)。 控制类描述的是特定用例的控制行为,与特定的用例实现密切相关,可以说它就是在执行用例实现,控制
40、类可以有效地降低边界类和实体类之间的耦合,使系统对于外部环境的变化具有良好的适应性。 17 【正确答案】 A 【试题解 析】 本题主要考查各设计模式的基本概念和作用。 (1)Adapter(适配器 )设计模式的意图是将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适用性:想使用一个已经存在的类,而它的接口不符合需求。 想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类 (即那些接口可能不一定兼容的类 )协同工作。 (仅适用于对象 Adapter)想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配
41、它们的接口。对象适配器可以适 配它的父类接口。 (2)Prototype(原型 )设计模式的意图是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 适用性:当要实例化的类是在运行时刻指定时。例如,通过动态装载;或为了避免创建一个与产品类层次平行的工厂类层次时;或当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 (3)Iterator(迭代器 )设计模式的意图是提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部 表示。 适用性:访问一个聚合对象的内容而无须暴露它的内部表示。迭代器模式支持
42、对聚合对象的多种遍历。也为遍历不同的聚合结构提供一个统一的接口 (即支持多态迭代 )。 (4)Observer(观察者 )设计模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性:当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。以下两种情况比较适合观察者模式:一个是当对一个对象的改变需 要同时改变其他对象,而不知道具体有多少对象有待改变;另一个是当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的。 18 【正确答案】 D
43、【试题解析】 本题考查面向对象的方法学知识,是常考的知识点。面向对象的三大特点就是封装、继承和多态。 封装性是一种信息隐蔽技术,使系统分析员能够清晰地标明他们所提供的服务界面,用户和应用程序员则只看得见对象提供的操作功能 (即封装面上的信息 ),看不到其中的数据或操作代码细节。封装就是将抽象得到的数据和行为 (或功能 )相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成 “类 ”,其中数据和函数都是类的成员。 多态性是指一般类中定义的属性或服务被特殊类继承后,可以具有不同的数据类型或表现出不同的行为,通常是使用重载和改写两项技术来实现的。简单地说,就是同一个操作作用
44、于不同的对象可以有不同的解释,产生不同的执行结果。 继承是指在某个类的层次关联中,不同的类共享属性和操作的一种机制。一个父类可以有多个子类。父类描述了这些子类的公共属性和操作,子类中还可以定义其自己的属性和操作。如果一个子 类只有唯一的一个父类,这种继承称为单一继承。如果一个子类有多个父类,可以从多个父类中继承特性,这种继承称为多重继承。 泛化与继承是类似的,只是方向相反,继承用来说明特殊类 (子类 )与一般类 (父类 )的关系,而泛化则用来说明一般类与特殊类之间的关系。 19 【正确答案】 D 【试题解析】 本题主要考查类与类之间的关系,也是考试中的一个重要知识点。类与类之间的关系,常见的有
45、依赖关系、泛化关系 (继承关系 )、组合关系、聚合关系、实现关系等。 (1)依赖关系。 有两个元素 X、 Y,如果修改元素 X的定义可能会引 起对另一个元素 Y的定义的修改,则称元素 Y依赖 (Dependency)于元素 X。在 LIML中,使用带箭头的虚线表示依赖关系,如图 5-4所示。 在类中,依赖由各种原因引起,例如,一个类向另一个类发消息;一个类是另一个类的数据成员;一个类是另一个类的某个操作参数。如果一个类的接口改变,它发出的任何消息可能不再合法。 (2)泛化关系。 泛化关系描述了一般事物与该事物中的特殊种类之间的关系,也就是父类与子类之间的关系。继承关系是泛化关系的反关系,也就是
46、说,子类是从父类继承的,而父类则是子类的泛化。在 UML中,使用带空心箭头的实线表示泛化关系,箭头指向父类,如图 5 5所示。 在 UML中,对泛化关系有 3个要求。 子类应与父类完全一致,父类所具有的关联、属性和操作,子类都应具有; 子类中除了有与父类一致的信息外,还包括额外的信息; 可以使用父类实例的地方,也可以使用子类实例。 (3)聚合关系。 聚合 (Aggregation)是一种特殊形式的关联,是传递和反对称的。聚合表示类之间的关系是整体与部分的关系。例如,一辆轿车包含 4个车轮、一个方向盘、一个发动机和一个底盘,就是聚合的一个例子。在 UML中,使用一个带空心菱形的实线表示 聚合关系
47、,空心菱形指向的是代表 “整体 ”的类,如图 5-6所示。 (4)组合关系。 如果聚合关系中表示 “部分 ”的类的存在与否,与表示 “整体 ”的类有着紧密的关系,例如 “公司 ”与 “部门 ”之间的关系,那么就应该使用 “组合 ”关系来表示这种关系。在 UML中,使用带有实心菱形的实线表示组合关系,如图 57所示。 由于题目指出“类 A由类 B的一个实例和类 C的一个或多个实例构成 ”,所以类 A与类 B、类 C的关系应为聚合或者组合关系,其示意图如图 5-8所示。 虽然组合和聚合都是表示整体和部分的关系,但组合中整体和部分的生命周期一样 ,而聚合中整体和部分的生命周期不一样。 (5)实现关系
48、。 实现关系将说明和实现联系起来。接口是对行为而非实现的说明,而类中则包含了实现的结构。一个或多个类可以实现一个接口,而每个类分别实现接口中的操作。 综上所述,可知本题的答案选 D。 20 【正确答案】 A 【试题解析】 本题考查面向对象方法学的类库及框架知识。 大量的程序员都尽可能多地利用现有的代码。程序员经常购买那些包装成库的代码。当 C语言流行时,代码库就是函数库。例如,可以购买一个数学库,该库含有完成微积分和代数运算的函数。通常,可以在程序 代码中使用一个包含文件来指定一个函数库,可以静态或动态地链接这个函数库。静态链接意味着库代码直接集成到程序中。在这种情况下,程序不依赖于其他文件,
49、但文件的大小可能很大。动态链接意味着程序有库的版本信息,其代码存放于一个单独的文件中,这个文件称为动态链接库 (DLL)。只有程序运行期间调用 DLL中的函数时,才加载DLL到内存。 DLL作为一个独立的实体存在于内存中,可以同时被多个程序访问。 出现 C+后,函数库转变为类库。两者的区别在于函数库只包含一系列函数,而类库是用面向对象编程的原理设计的。例如,可以 为数据结构做一个类库,该库包括一个链接列表的类。如果使用一个函数库代替,那么链接列表会独立于操作它的函数。另一方面,使用类库时,链接列表和操作它的函数存在于同一个文件的同一个类中。然而,正如使用函数库一样,使用类库涉及包含文件和链接一个静态库。最近,已经从类库发展到模板库。其原因是 C+编译器现在已经能够处理 C+模板。模板库提供了一系列优于类库的优点。要使用模板库,只要在程序中加入包含文件即可,不用链接到库,因为所有的库代码已经包含在该包含文件中了。 Visual C有三个供开发者使用的库:一个类库 (MFC),两个模板库 (ATL和 STL)。 框架是对于那些试图在所关心的领域构