第五章 面向对象设计
面向过程思想
众所周知的,C语言是一门 面向过程编程 的语言,而C++是一门 半面向对象编程(Object Oriented Programming,OOP) 的语言.
面向过程编程的语言通常将代码分割成小块,每个小块理论上完成单一的任务.如果在C程序中没有过程,所有代码都会集中于main()中.
事实上,计算机并不关心代码是位于main()中还是被分割成具有描述性名称和注释的小块.
经管C语言将过程表示为"函数",但是 C并非为一门真正的函数式语言 ."函数式(functional)"与"过程式(procedural)"有着很大的不同.函数式语言指类似于Lisp的语言.
面向对象思想
与基于"程序做什么"问题的面向过程方法不同,面向对象方法提出另一个问题: 对哪些对象进行建模?
OOP的基本观念是不应该将程序分割为若干任务,而是将其分为 自然对象的模型.
类
类(class) 将对象与其定义区分开来, 对象(object) 是类的一个 实例(instance).它拥有一些特征,从而与同一类型的其他事物区分开来.
组件
考虑一个复杂实际对象,会发现其由许多 组件(component) 所组成.对于OOP来说,将对象分解为更小的组件是一种必备能力,就像将复杂任务分解为较小过程是过程式编程的基础一样.
本质上,组件与类类似,但是组件更小、更具体
属性
属性(attribute) 将一个对象与其他对象区分开来.所有的对象都具有相同的属性,但是属性的值不同.属性用来描述对象的特征.
行为
行为 回答两个问题: "对象做什么" 和 "能对对象做什么".
在面向对象编程中,许多功能性的代码从过程转移到类.通过建立具有某些行为的对象并定义对象的交互方式,OOP以更丰富的机制将代码和代码操作的数据联系起来. 类的行为由类方法实现.
类之间的关系
"有一个"关系
在此类关系中,可认为某个类是另一个类的一部分.组件通常代表"有一个关系",因为组件表示组成其他类的类.
"有一个"关系有如下两种类型:
-
聚合:当聚合器被销毁时,聚合对象(组件)可以继续存在.例如:假设动物园包含一组动物对象,当动物园破产时动物对象不会被销毁,他们被转移到另一个动物园.
失M(money)棍哥 -
组合:对于组合,如果由其他对象组成的对象被销毁,那么这些其他对象也会被销毁.
"是一个"关系
"是一个"关系是面向对象编程中非常基本的概念,因此有许多名称,包括 派生(deriving),子类(subclass),扩展(extending)和继承(inheriting).
类模拟了现实世界包含具有属性和行为的对象这一事实,继承模拟了这些对象通常以层次方式来组织这一事实.
- 继承技术
当生成子类时,程序员有多种方法将某个类与其父类区分开.可使用多种方法生成子类.
- 添加功能:增加新的方法
- 替换功能:采用虚方法机制
- 添加属性:增加新的属性
- 替换属性:属性的重定义 - 多态性
多态性(polymorphism) 指遵循一套标准属性和方法的对象可互换使用.类定义就像对象与之交互代码之间的契约.
"not-a"关系
当考虑类之间的关系时,应该考虑类之间 是否真的存在关系 .不要把面向对象设计的热情全部转换为许多不必要的类/子类关系
混入类
混入(mixin)类代表了类之间的另一种关系.在C++中,混入类的语法类似于多重继承,但语义完全不同.
使用混入类,可向类中添加功能,而不需要保证是完全的"是一个"关系.可将它当做一种分享(share-with)关系.
UML
统一建模语言(Unified Modeling Language,UML) 是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言.UML是面向对象设计的建模工具,独立于任何具体程序设计语言.
- UML的图形:
- 用例图:从用户角度描述系统功能
- 类图:描述系统中类的静态结构
- 对象图:系统中的多个对象在某一时刻的状态。
- 状态图:是描述状态到状态控制流,常用于动态特性建模
- 活动图:描述了业务实现用例的工作流程
- 顺序图:对象之间的动态合作关系,强调对象发送消息的顺序,同时显示对象之间的交互
- 协作图:描述对象之间的协助关系
- 构件图:一种特殊的UML图来描述系统的静态实现视图
- 部署图:定义系统中软硬件的物理体系结构
- 包图:对构成系统的模型元素进行分组整理的图
- 组合结构图:表示类或者构建内部结构的图
- 交互概览图:用活动图来表示多个交互之间的控制关系的图
类图
类的基本表示法,包括了 名称,属性,方法:
- 属性定义的格式:[可视性]属性名[:属性类型],其中[]内为可选内容
- 方法定义的格式:[可视性]操作名[(参数列表)][:返回类型][{特性}]
- 方法表示的意义:
- -表示private
- #表示protected
- ~表示default,也就是包权限
- _下划线表示static
- 斜体表示abstract
类关系
在UML类图中,常见的有以下几种关系: 关联(Association),继承(Inheritance),依赖(Dependency),聚合(Aggregation),组合(Composition),实现(Realization).
并且这些关系中有时之间是有关联的,存在关系之间的强弱.
- 关联:是一种拥有的关系,它使一个类知道另一个类的属性和方法,在C++中通过friend声明友元实现.
- 继承:即继承关系,在C++中通过其内置的继承关系语法来实现.
- 依赖:两个相对独立的对象,一个对象负责构造另一个对象的实例.
- 聚合:是整体与部分的关系,且部分可以离开整体而单独存在.
- 组合:是一种强的拥有关系,体现了严格的部分和整体关系.
- 实现:表示一个class类实现interface接口的功能.