UML类和类之间的关系详解

UML类

在Class类中,一般都封装了属性和行为方法,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的功能职责1,一个类可以有多种职责,设计得好的类一般只有一种职责,即符合单一职责原则。

  • 在定义类的时候,将类的职责分解成为类的属性和行为操作(即方法)。类的属性即类的数据职责,类的操作即类的行为职责。设计类是面向对象设计中最重要的组成部分,也是最复杂和最耗时的部分

  • 在软件系统运行时,类将被实例化成对象(Object),对象对应于某个具体的事物,是类的实例(Instance)。

  • 类图(Class Diagram)使用出现在系统中的不同类来描述系统的静态结构,它用来描述不同的类以及它们之间的关系。

    在系统分析与设计阶段,类通常可以分为三种,分别是实体类(Entity Class)控制类(Control Class)边界类(Boundary Class),下面对这三种类加以简要说明:
    (1) 实体类:实体类对应系统需求中的每个实体,它们通常需要保存在永久存储体中,一般使用数据库表或文件来记录,实体类既包括存储和传递数据的类,还包括操作数据的类。实体类来源于需求说明中的名词,如学生、商品等。

    (2) 控制类:控制类用于体现应用程序的执行逻辑,提供相应的业务操作,将控制类抽象出来可以降低界面和数据库之间的耦合度。控制类一般是由动宾结构的短语(动词+名词)转化来的名词,如增加商品对应有一个商品增加类,注册对应有一个用户注册类等

    (3) 边界类:边界类用于对外部用户与系统之间的交互对象进行抽象,主要包括界面类,如对话框、窗口、菜单等。

  • 在面向对象分析和设计的初级阶段,通常首先识别出实体类,绘制初始类图,此时的类图也可称为领域模型,包括实体类及其它们之间的相互关系。

  • 在UML类图中,类使用包含类名、属性和操作且带有分隔线的长方形来表示。

  • 在软件系统中,类并不是孤立存在的,类与类之间存在各种关系,对于不同类型的关系,UML提供了不同的表示方式,下面将逐步详细介绍。参考链接

类的属性的表示方式

在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个User类,它包含createTime,userName、userPhone和sex这4个属性,以及getUserInfo(Long id)和getAllUserInfo()方法。
在这里插入图片描述
那么属性或者方法名称前加的加号和减号是什么意思呢?它们表示了这个属性或方法的可见性,UML类图中表示可见性的符号有三种:

  • + :表示public
  • - :表示private
  • #:表示protected(friendly也归入这类)

因此,上图中的User类具有3个私有属性,一个公开属性和两个公有方法。当然啦,不同的建模工具,可能有细微的差别,比如Rational Rose建模工具里,可见性不是用加好和减号表示的,用图标表示的。

实际上,类的属性的完整表示方式是这样的:

可见性  名称 :类型 [ = 缺省值]

中括号中的内容表示是可选的。

类的方法的表示方式

方法的完整表示方式如下:

可见性  名称(参数列表) [ : 返回类型]

同样,中括号中的内容是可选的。

比如在下图的Dept类中,定义了3个方法:
在这里插入图片描述
这三个方法的可见性详解:

  • getDeptInfoById方法可见性为public类型,接收一个Long类型的id参数,返回值类型为Dept
  • getAllDeptInfoList方法可见性为private,该方法无形参,返回值类型为List
  • checkParam方法为可见性protected类型,接收参数类型为Dept,返回值类型为void

类与类之间关系

类和类之间的6种关系:
泛化(Generalization)实现(Realization)关联(Association)聚合(Aggregation)组合(Composition)依赖(Dependency)

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

类之间6种关系汇总:

关系 关系如何使用UML图表达
泛化 使用带空心三角形的实线表示泛化(继承)关系
实现 使用带空心三角形的虚线表示实现关系
关联 单向关联使用一个带箭头的实线表示,双向关联使用一个不带箭头的实线表示,自关联使用一个带有箭头且指向自身的实线表示
聚合 聚合关系用带空心菱形和箭头的实线表示
组合 组合关系用一个带实心菱形和箭头的实线表示
依赖 依赖关系用一条带有箭头的虚线表示

下面使用类图,详细介绍每一种关系。

1.1 泛化关系

泛化关系,指的就是:类和类、接口与接口之间的继承关系。继承关系可以用IS-A 表示。

举例:
人是一种高级动物,就可以表示为:Person是一个(IS-A)高级动物,这就是一种继承关系。
在这里插入图片描述
继承使用的是extends关键字,在UML类图中,使用带空心三角形的实线表示泛化(继承)关系,如下图所示中,Person类与Cat类都继承了Animal类。Person和Cat都会继承到Animal的公有方法eat()方法。
在这里插入图片描述

1.2 实现关系

接口是一种特殊的抽象类,实现关系(like a)使用的是implements关键字,在UML类图中,使用带空心三角形的虚线表示实现关系。如下图中,定义了一个抽象动物接口,里面有个公开的eat()方法。使用Dog类实现了Animal接口的eat()方法。
在这里插入图片描述

1.3 关联关系

关联关系指的是,一个类与另一个类之间有某种关联。这种关联关系可以使用HAS-A表示。
关联关系如果进行详细的划分,又可进一步分为单向关联双向关联自关联

  • 单向关联

    我们可以看到,在UML类图中,单向关联使用一个带箭头的实线表示
    在这里插入图片描述

  • 双向关联
    在这里插入图片描述
    从上图中我们很容易看出,所谓的双向关联就是双方各自持有对方类型的成员变量。在UML类图中,双向关联使用一个不带箭头的实线表示。上图中在Dept类中维护一个User类型的成员变量,在User类中,也维护了一个Dept类型的成员变量,这种就属于双向关联。

  • 自关联

    自关联在UML类图中,自关联使用一个带有箭头且指向自身的实线表示
    在这里插入图片描述
    上图的意思就是Node类包含类型为Node的成员变量,也就是“自己包含自己”。

1.4 聚合关系

聚合关系描述的是整体和部分的关系,是一种比较特殊的关联关系。在聚合关系中,整体的生命周期,不会决定部分的生命周期。

比如:
汽车和发动机引擎之间的关系、老师和学生之间的关系,就是整体和部分的关系。
在这里插入图片描述
上图中的Car类与Engine类就是聚合关系(Car类中包含一个Engine类型的成员变量)。由上图我们可以看到,在UML类图中,聚合关系用带空心菱形和箭头的实线表示。聚合关系强调是“整体”包含“部分”,但是“部分”可以脱离“整体”而单独存在。比如上图中汽车包含了发动机引擎,汽车脱离了发动机是可以单独存在的,而发动机引擎脱离了汽车也能单独存在。

1.5 组合关系

组合关系也可以看作是一种特殊的聚合关系,是一种比聚合关系还要强的关系。整体的生命周期决定部分的生命周期,部分是依附在整体上面的,有时候也有人称为合成关系
组合关系与聚合关系最大的不同在于:组合关系这里的“部分”脱离了“整体”是无法存活的,部分就不复存在。比如下图人体和细胞的关系:
在这里插入图片描述
细胞组成人的一部分,显然,细胞脱离了人,是不能单独存在的。在UML类图中,组合关系用一个带实心菱形和箭头的实线表示

1.6 依赖关系

依赖关系是比关联关系弱的一种关系,是所有关系中最弱的一种,在java语言中体现为返回值,参数,局部变量和静态方法调用。
在这里插入图片描述
从上图我们可以看到,汽车驾驶员CarDriver的drive方法只有传入了一个Car对象才能发挥作用,因此我们说CarDriver类依赖于Car类。在UML类图中,依赖关系用一条带有箭头的虚线表示


好啦,UML类之间的6种关系介绍完了,如果这篇文章对你有帮助,欢迎给个赞,您的支持,是博主创作最大的动力!

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

给自己的梦想添加一双翅膀,让它可以在天空中自由自在的飞翔!


  1. 职责指的是一个类要完成什么样的功能,要承担什么样的义务。 ↩︎

猜你喜欢

转载自blog.csdn.net/smilehappiness/article/details/105527488