面向对象-类与类的6大关系及UML图(多重度)

类关系

在面向对象开发中,类之间有各种各样的相互关系,如下:

  • 泛化关系(继承)
  • 实现关系
  • 依赖关系
  • 关联关系
    • 聚合关系
    • 组合关系

类关系以java为基础,python做了一些借鉴

UML

为了说明类与类的关系,采用UML建模,关于UML参见:
http://www.malaoshi.top/show_1EF2GcHIk5xB.html

箭头指向总结

A 类代码中,有B类,不论什么关系,箭头从 A 指向 B

组合、聚合特殊:菱形箭头指向 整体,另一头可能有箭头

泛化关系(继承)

UML类图

说法:Son 继承 Father

箭头方向: 空心箭头实线,子类指向父类

实现

代码体现类实现接口

特点: 类A 是实现类, 图中的类 B 是接口

说法:A 实现 B

箭头方向: 空心箭头虚线,实现类 指向 接口

依赖关系

理解:依赖 理解成 需要

代码体现:类A使用类B作为局部变量、方法参数、返回值等。

特点:Teacher 的 updateStudentInfo(Student student) 方法中用到 Student 类

说法:Teacher 依赖(需要) Student

箭头方向:虚线箭头,指向 被使用者

关联关系

代码体现:A类的成员变量中含有B类。

UML类图

特点: A 类的成员变量,含有 B 类

说法:Teacher 依赖 Student

箭头方向:实线箭头,从A类指向B类

聚合关系

整体和部分的关系:

  1. 代表了has-a的关系
  2. 整体和部分之间是可分离的,部分可以属于多个整体
  3. 整体和部分拥有 各自的生命周期。整体存在与否不会相互影响部分,反之亦然

例子:农民饲养鸡鸭鹅,农民可以有多个鸡鸭鹅,一个农民对应多只鸡鸭鹅,农民是 整体,鸡鸭鹅是 部分,而且 有各自的生命周期,是聚合关系

代码体现:作为整体的A类,有序列类型的属性,用于保存部分。如:学校类和学生类、公司类和员工类等,就属于聚合关系。

例子

班级和教师、学生的关系,一个班级由一群学生和教师组成了,当班级解散后,教师和学生都还存在

代码体现:作为整体的 ClassInfo 类的成员变量有 Student对象集合

箭头方向:空心菱形的实线,菱形指整体,另一头(可能有箭头)指部分

多重度

在关联关系、聚合关系、组合关系中,还要标出多重度,即:是 0 个,还是 1 个,还是 n 个:

  • 1 :表示1个对象

  • 0..* 或 * :表示集合中的0个或多个对象

  • 1..*:表示集合中的1个或多个对象

  • 0..1:表示一个集合中的0个或1个对象

例子

  • 1 → 0..* :表示1个对象 对应 0或多个对象。(可以不对应)

  • 1 → 1..* :表示1个对象 对应 0或多个对象。(至少对应一个)

  • 1..* → 0..*:表示 1或多个对象 对应 0或多个对象。(可以不对应)

组合关系

整体与部分的关系,这种 关系比聚合更强:

  1. 代表contains-a的关系
  2. 在组合的关系中,彼此依赖的,不可分割
  3. 具有 相同的生命周期,整体被销毁,部分也会被销毁

代码体现:从代码上看,与聚合相同,只能 从语义区分

例子

教学楼和教室,有教学楼才有教室,如果教学楼被炸了,教室也会被炸掉

代码体现:作为整体的 ClassRoomBuilding 类的成员变量有 ClassRoom对象集合

箭头方向:实心菱形的实线,菱形指整体,另一头指部分


原文出处:/show_1GWE6ackbj1.html