文章目录
1.面向对象程序设计概述
- 面向对象程序设计(简称 OOP) 是当今主流的程序设计范型, 它已经取代了 20 世纪 70 年代的“ 结构化” 过程化程序设计开发技术。
1.1 面向对象程序设计
Java 是完全面向对象的, 必须熟悉 OOP 才能 够编写 Java 程序
。- 面向对象的程序是由对象组成的, 每个对象包含对用户公开的特定功能部分和隐藏的实 现部分。程序中的很多对象来自标准库,还有一些是自定义的。
1.2 传统结构化程序设计
传统的结构化程序设计
通过设计一系列的过程(即算法)来求解问题。一旦确定了这些 过程, 就要开始考虑存储数据的方式。这就是 Pascal 语言的设计者 Niklaus Wirth将其著作命 名为《算法 + 数据结构 = 程序》- 在 Wirth命名的书名中,
算法是第一位的,数据结构是第二位的
,这就明确地表述了程序员的工作方式。 先要确定如何操作数据, 然后再决定如何组织数据, 以便于数据操作。 而OOP 却调换了这个次序, 将数据放在第一位,然后再考虑操作数据的算法
。
1.3 面向对象与面向过程举例
举个例子简单说明面向过程开发与面向对象oop开发的不同:
- 对于一些规模较小的问题, 将其分解为过程的开发方式比较理想。
- 而面向对象更加适用 于解决规模较大的问题。
- 要想实现一个简单的 Web 浏览器可能需要大约 2000 个过程,这些
过程
可能需要对一组全局数据
进行操作。- 采用
面向对象
的设计风格, 可能只需要大约 100 个 类
,每个类平均包含 20 个方法(如图 4-丨所示)。- 后者更易于程序员掌握, 也容易找到 bug 假设给定对象的数据出错了,在访问过这个数据项的 20 个方法中查找错误要比在 2000 个过 程中查找容易得多
2.类之间的关系
在类之间, 最常见的关系有:
- 泛化/继承(Generalization)
- 实现(Realization)
- 关联(Association)
- 聚合(Aggregation)
- 组合(Composition)
- 依赖(Dependency)
2.1 泛化/继承
- 含义:继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
- 代码体现:在Java中继承关系通过关键字
extends
明确标识 - 箭头指向:继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。
2.2 实现
- 含义:实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。
- 代码体现:在Java中此类关系通过关键字
implements
明确标识 - 箭头指向:实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。
2.3 依赖
-
含义:一种使用的关系,即一个类的实现需要另一个类的协助,要尽量不使用双向的互相依赖.
这种使用关系是具有偶然性的、临时性的、非常弱的,类B的变化会影响到类A。
-
代码表现:
局部变量、方法的参数或者对静态方法的调用;
类B作为方法参数(局部变量)被类A在某个method方法中使用 -
箭头指向:用带箭头的虚线表示,指向被使用者
2.4 关联
-
含义:是一种拥有的关系,它使一个类知道另一个类的属性和方法;
这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。
如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
-
代码体现:
成员变量。
被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。 -
箭头指向: 带普通箭头的实心线,指向被拥有者
2.5 聚合
-
含义:聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。
此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。
-
代码体现:成员变量;和关联关系是一致的,只能从语义级别来区分
-
箭头指向:带空心菱形的实心线,菱形指向整体
2.5 组合
-
含义:组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。
它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。比如公司和部门是整体和部分的关系,没有公司就不存在部门。
-
代码体现:成员变量;和关联关系是一致的,只能从语义级别来区分
-
箭头指向:带实心菱形的实线,菱形指向整体
2.6 强弱顺序
各种关系的强弱顺序:泛化/继承 = 实现 > 组合 > 聚合 > 关联 > 依赖
2.7 一张图融会贯通
下面这张UML图,比较形象地展示了各种类图关系:
3. 参考文献
- http://www.uml.org.cn/oobject/201609062.asp#
- https://www.cnblogs.com/liuling/archive/2013/05/03/classrelation.html