详解:面向对象与面向过程的比较 & 类之间的关系:泛化、实现、依赖、关联、聚合、组合

本文已同步到:https://www.bithachi.cn/posts/769cd987.html

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.类之间的关系

在类之间, 最常见的关系有:

  1. 泛化/继承(Generalization)
  2. 实现(Realization)
  3. 关联(Association)
  4. 聚合(Aggregation)
  5. 组合(Composition)
  6. 依赖(Dependency)

在这里插入图片描述

2.1 泛化/继承

  • 含义:继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。
  • 代码体现:在Java中继承关系通过关键字extends明确标识
  • 箭头指向:继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。

image-20200730233912528

image-20200730235837723

2.2 实现

  • 含义:实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。
  • 代码体现:在Java中此类关系通过关键字implements明确标识
  • 箭头指向:实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。

image-20200730234024499

image-20200730235911565

2.3 依赖

  • 含义:一种使用的关系,即一个类的实现需要另一个类的协助,要尽量不使用双向的互相依赖.

    这种使用关系是具有偶然性的、临时性的、非常弱的,类B的变化会影响到类A。

  • 代码表现:局部变量、方法的参数或者对静态方法的调用;类B作为方法参数(局部变量)被类A在某个method方法中使用

  • 箭头指向:用带箭头的虚线表示,指向被使用者

image-20200730234318100

image-20200730235930003

2.4 关联

  • 含义:是一种拥有的关系,它使一个类知道另一个类的属性和方法;

    这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。

    如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

  • 代码体现:成员变量。被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。

  • 箭头指向: 带普通箭头的实心线,指向被拥有者

image-20200730235106481

image-20200730235804652

2.5 聚合

  • 含义:聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。

    此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。

    比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。

  • 代码体现:成员变量;和关联关系是一致的,只能从语义级别来区分

  • 箭头指向:带空心菱形的实心线,菱形指向整体

image-20200730235741993

image-20200730235750830

2.5 组合

  • 含义:组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。
    它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,

    比如人和人的大脑。比如公司和部门是整体和部分的关系,没有公司就不存在部门。

  • 代码体现:成员变量;和关联关系是一致的,只能从语义级别来区分

  • 箭头指向:带实心菱形的实线,菱形指向整体

image-20200731000327025

image-20200731000334893

2.6 强弱顺序

各种关系的强弱顺序:泛化/继承 = 实现 > 组合 > 聚合 > 关联 > 依赖

2.7 一张图融会贯通

下面这张UML图,比较形象地展示了各种类图关系:

image-20200731001326493

3. 参考文献

  • http://www.uml.org.cn/oobject/201609062.asp#
  • https://www.cnblogs.com/liuling/archive/2013/05/03/classrelation.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值