软件设计师学习-第七章 面向对象技术

wiki

本章涉及单选题型和案例分析题型,上午的客观题占 11 分,下午的案例题至少一题

1. 面向对象基础

1. 面向对象的概念

面向对象 = 对象(object)+ 类(classification)+ 继承(inheritance)+ 消息通信(communication with messages)。

面向对象是一种程序设计风格,不只是一种具有构造继承性、封装性、多态的程序设计语言族的命名。

1. 对象

对象是基本运行时的实体,包括属性(数据)和行为(作用于数据的操作),对象把两者封装成整体。

组成:一个对象一般由对象名(标识)、属性、方法,三个部分组成。

  • 从程序设计者来看,对象是一个程序模块
  • 从用户来看,对象为他们提供了所希望的行为

封装:是一种信息隐藏技术,目的是将对象的使用者和生产者分离,使对象的定义和实现分开。

2. 类

类是在对象上的抽象,对象是类的具体化,是类的实例(instance)。

在分析和设计时,只需对类作出定义,而对类的属性进行不同的赋值即可得到该类的对象实例。

分类:实体类、接口类、控制类。

3. 继承

继承是父类与子类之间共享数据和方法的机制。

在定义和实现一个类的时候,可以在一个已经存在的类的基础上进行,并把这个类所定义的内容作为自己的内容,并加入若干新的内容。

  • 多态:在收到消息时,对象要予以响应。不同的对象收到同一信息可以产生不同的结果,这个现象称为多态(polymorphism)。
    • 多态的实现源于继承的支持
    • 分类:通用的(参数的、包含的)和特定的(过载的、强制的)
  • 绑定:绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程
    • 静态绑定:在一般的程序设计语言中,绑定是在编译时进行的,称为静态绑定
    • 动态绑定:基于继承和多态,在运行时,根据接收对象的具体情况,将方法与对象进行连接

4. 消息

对象之间进行通信的一种构造称为消息。

发送消息的对象不需要知道接收消息的对象如何对请求予以响应。

当一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息,接收到信息的对象经过解释,然后予以响应,这种通信机制称为消息传递。

2. 面向对象分析(OOA)

创建分析模型,包括五个活动:①认定对象;②组织对象;③对象间的相互作用;④定义对象的操作;⑤定义对象的内部信息。

3. 面向对象设计(OOD)

将分析模型转化为设计模型,根据语言特性(如是否支持继承等)进行结构调整和系统设计。

  • 活动:①识别类及对象;②定义属性;③定义服务;④识别关系;⑤识别包。
  • 原则:
    • 单一责任原则(SRP):只有一个导致该类变更的原因
    • 开闭原则(OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭
    • 里式替换原则(LSP):子类必须能替换掉它的基类,且执行效果不变
    • 依赖倒置原则(DIP):抽象不应该依赖细节,细节应该依赖抽象;高层模块不能依赖低层模块,二者都应该依赖抽象
    • 接口分离原则(ISP):不应该强迫客户依赖它们不用的方法
    • 其他原则:重用发布等价原则、共同封闭原则、共同重用原则、无环依赖原则、稳定依赖原则、稳定抽象原则

4. 面向对象程序设计(OOP)

面向对象程序设计(OOP)的实质是选用一种面向对象程序设计语言(OOPL),采用对象、类及其相关概念所进行的程序设计。

它的关键在于加入了类和继承性,从而进一步提高了抽象程度。

1. 类

通常在介绍 OOP 时,先引入对象的概念,然后从对对象进行抽象的角度来引入类的概念。但当设计和实现一个面向对象的程序时,首先接触到是类和类层次结构。

2. 继承、类层次结构

在 OOPL 中,继承一般通过定义类之间的关系来体现,在面向对象系统中,子类和父类之间的继承关系构成了这个系统的类层次结构。

与一般数据类型的实例化过程相比,类的实例化过程是一种实例的合成过程,而不仅仅是根据单个类型进行的空间分配、初始化和绑定。

3. 对象、消息传递、方法

对象是类的实例。它们之间存在着本质区别:对象之间通过消息传递的方式进行通信。

对象被看成用传递消息的方式互相联系的通信实体,它们可以接收和拒绝外界发来的消息,通常消息名称就是这个对象的方法名。

4.对象自身引用

对象自身引用(self-reference)是 OOPL 中的一种特有结构。这种结构在不同的 OOPL 中有不同的名称,在 C++ 和 Java 中称为 this,在 Smalltalk-80、Object-C 和其他一些 OOPL 中则称为 self。

5.重载

重载或覆盖(overriding)是在子类中重新定义父类中已经定义的方法,其基本思想是通过一种动态绑定机制的支持,使子类在继承父类接口定义的前提下用适合自己要求的实现去置换父类中的相应实现。

6.类属

类属是程序设计语言中普遍注重的一种参数多态机制,在 Java 中称为泛型,在 C++ 语言中,类属有专门的术语 template。

7.无实例的类

存在继承关系时,可能在类层次结构的较高层次上看到始终没有实例的类。要创建无实例的类,需要语言支持,在 Java 和 C++ 中,就是抽象类。

5. 面向对象测试

面向对象测试可以分为四个层次:

  • 算法层:相当于单元测试,用于测试类中定义的每个方法
  • 类层:相当于模块测试,用于测试封装在同一个类中的所有方法与属性之间的相互作用
  • 模板层:相当于集成测试,用于测试一组协同工作的类之间的相互作用
  • 系统层:相当于系统测试,把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试

2. UML

1. 事物

  • 结构事物:UML 中静态部分,包括类(class)、接口(interface)、协作(collaboration)、用例(use case)、主动类(active class)、构件(component)、制品(artifact)、结点(node)
  • 行为事物:UML 中动态部分,包括交互(interaction)、状态机(state machine)、活动(activity)
  • 分组事物:UML 中组织部分,总重要的是包,包是把元数据组成组的机制,这种机制具有很多用途。结构和行为事物等,都可放进包里。
  • 注释事物:UML 中解释部分,用来描述、说明、标注模型的任何元素

2. 关系

UML 中有四种关系:

  • 依赖(Dependency):两个事物之间的语义关系,其中一个事物发生变化会影响另一个
  • 关联(Association):类与类之间的联接,可以标注重复度和角色
    • 聚合(Aggregation):整体与部分的关系,且部分可以离开整体而单独存在
    • 组合(Composition):整体与部分的关系,且部分不可以离开整体而单独存在
  • 泛化(Generalization):一般化(父元素)和特殊化(子元素)的关系,箭头指向父元素
  • 实现(Realization):一般用在接口和实现类之间,或者用例和实现它们的协作之间

这四种关系是 UML 模型中可以包含的基本关系事物。它们也有变体,例如,依赖的变体有精华、跟踪、包含、延伸。

  • 重复度:一般标注在关联上,表示为一个整数范围 n..m,常见的有 0..10..*1..11..*

UML关系

3. UML 的图

1. 类图

类图展现了一组对象、接口、协作和它们之间的关系。

类图

  • 类的矩形框为三层,上到下为类名、成员变量、类方法
  • 符号表示成员变量以及方法前的访问修饰符:
    • + 表示 public
    • - 表示 private
    • # 表示 protected
    • 不带符号表示 default
  • 抽象类:用斜体字表示类名、抽象方法名
  • 接口:用 <<interface>> 或者 “圆圈+实线” 表示
  • 包:用矩形+上面小矩形表示

2. 对象图

对象图展现了某一时刻一组对象和它们之间的关系。对象图一般包括对象和链。

对象图

3. 用例图

用例图展现了一组用例、参与者和它们之间的关系。

用例图

4. 交互图

交互图用于对系统的动态方面进行建模。一张交互图表现的是一个交互行程序由一组对象和它们之间的关系组成,包含它们之间可能传递的消息。

交互图可以分为序列图、通信图、交互概览图和时序图:

1. 序列图

序列图是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动,
强调的是信息时间顺序的交互图。有两个不同于通信图的特征:

  • 序列图有对象生命线
  • 序列图有控制焦点

序列图

2. 通信图

通信图强调收发信息的对象的结构组织,在早期版本中也被称为协作图,强调
参加交互的对象的组织。有两个不同于序列图的特征:

  • 通信图有路径
  • 通信图有顺序号

通信图

3. 交互概览图

交互概览图是 UML 2.0 新增的交互图之一,它是活动图的变体,描述业务
过程中的控制流概览、软件过程中的详细逻辑概览及多个图进行拼接,抽象掉信息和生命线。它使用了活动图的表示法。

交互概览图

4. 时序图

另一种新增的、特别适合实时嵌入式系统建模的交互图称为时序图。其关注沿
着线性时间轴、生命线内部和生命线之间的条件改变。它描述对象的状态随着时间改变的情况,很像示波器,

时序图

5. 状态图

状态图通常包括简单状态和组合状态、转换(事件和动作)。

状态图

6. 活动图

活动图专注系统的动态视图,它对于系统的功能建模特别重要,并强调对象间的控制流程。活动图一般包括活动状态和动作状态、转换和对象。

活动图

7. 构件图

构件图展现了一组构件之间的组织和依赖关系,专注于系统静态实现视图。

构件图

8. 组合结构图

组合结构图用于描述一个分类器(如类、构件等)的内部结构,分类器与系统中其他组成部分之间的交互端口,展示一组相互协作的实例如何完成特定的任务,描述设计、架构模式或策略。

组合结构图

9. 部署图

部署图是用来对面向对象系统的物理方面建模的方法,展现了运行时处理结点及其中构件(制品)的配置。一般对系统的静态部署视图进行建模,与构件图相关。

部署图

10. 包图

包图用于把模型本身组织成层次结构的通用机制,不能执行,展现由模型本身分解而成的组织单元及之间的依赖关系。

包图

3. 设计模式

1. 设计模式的要素

设计模式的四个基本要素为:①模式名称;②问题;③解决方案;④效果。

2. 创建型设计模式

创建型设计模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类的创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。

创建型设计模式的基本要素为:

  • 抽象工厂(Abstract Factory)
  • 生成器(Builder)
  • 工厂方法(Factory Method)
  • 原型(Prototype)
  • 单例(Singleton)

3. 结构型设计模式

结构型设计模式的基本要素为:

  • 适配器(Adapter)
  • 桥接(Bridge)
  • 组合(Composite)
  • 装饰(Decorator)
  • 外观(Facade)
  • 享元(Flyweight)
  • 代理(Proxy)

4. 行为型设计模式

行为型设计模式涉及算法和对象间职责的分配,描述了二者之间的通信模式。

行为设计模式的基本要素为:

  • 责任链(Chain of Responsibility)
  • 命令(Command)
  • 解释器(Interpreter)
  • 迭代器(Iterator)
  • 中介者(Mediator)
  • 备忘录(Memento)
  • 观察者(Observer)
  • 状态(State)
  • 策略(Strategy)
  • 模板方法(Template Method)
  • 访问者(Visitor)