前言

最早了解UML类图是《大话设计模式》中,但后来在工作中压根就没画过UML类图image.png,直到最近在看源码和设计模式时发现——太重要了!利用UML类图,可以使整个架构设计更清晰,类与类之间的关系一目了然。

UML简介

UML(Unified Modeling Language)统一建模语言。可以用来对复杂系统进行建模,而我们Java平常说的UML类图只是UML模型中图形表达方式之一,它还有例图、协作图、活动图、序列图、部署图、构件图、状态图等。因此需要再次说明,我们本篇讲的是UML类图,不要把概念搞混了。

类、接口的表示

06-UML类图.png
图片来源:《大话设计模式》

这是一张经典的UML类图,我们将会围绕这张图进行介绍UML类图中一些常用的表现形式。

类的表示

一个类由三部分组成,类的名称、类的属性(成员变量)、类的方法。
image.png
(普通类)
image.png
(抽象类)
image.png
(接口)

类的名称

类的名称就是一个字符串,抽象类用斜体表示,接口用<<>>表示

类的属性

类的属性格式如下:

  1. [可见性]属性名:类型[=默认值]

可见性:也就是Java中的public、private、protected,default分别对应UML中的+、-、#、~

例如:

  1. - water:int // 等于Java中的 private int water;

类的方法

类的方法格式如下:

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

注:抽象方法用斜体来表示

例如:

  1. + say(String msg):void

其它

静态类型也就是static修饰的会用下划线来表示

类之间的关系

依赖关系

是一种使用关系,是临时性的关联,非常弱的关系。可以理解为一个类用到了另一个类中的方法和属性。因为是一种弱关系所以使用虚线;它是被人用的,但是不知道被谁用,所以箭头指向确定的一方。例如:箭头指向被使用者Phone类,Person使用Phone。

image.png
依赖关系

关联关系

是对象之间的引用关系,是最常用的一种关系,关联关系可以分为一般关联关系、聚合关系、组合关系。

一般关联关系

对象与对象之间的引用关系,因此可以使单向的也可以是双向的,双向可以用两个实心箭头或者不用实心箭头,单向实心箭头则指向被关联类。例如:Student引用了Teacher所以箭头指向Teacher。
image.png
一般关联关系

聚合关系

是强关联关系,是整体和部分之间的关系,是 has-a 的关系。整体和部分是可以分离的,有各自的生命周期。菱形在整体的一边,因为是强关系所以也用实线。例如:学校和老师的关系
image.png
聚合关系

组合关系

也表示类之间的整体与部分的关系,但它是一种更强烈的聚合关 系,是 cxmtains-a 关系,整体可以控制部分的生命周期,整体一旦不存在,部分也不存在。实心菱形在整体一边,因为是强关系所以也用实线。例如:翅膀和鸟的关系。

image.png
组合关系

泛化关系

是耦合度最高的一种关系,是is-a关系,是继承关系,是父与子的关系。空心三角形表示继承,其中箭头始终指向确定的一方,父类是确定的,而子类是不确定的;继承是很实实在在的所以用实线。例如:Person和Student的关系。

image.png
泛化关系

实现关系

实现是类与接口之间的关系,实现关系用空心三角形和虚线来表示。例如猴子实现了动物接口。

image.png
实现关系

小结

根据我的学习经验,这些箭头谁指向谁?什么情况用哪种符号?实心还是空心?让人头大。
image.png
但真正理解了类与类之间的关系,然后多画图,也还OK啦!为此,整理了个表格,方便快速查看 : )

名称 图案 描述
箭头 image.png 指向确定性的一方,例如子类指向父类,因为父类是确定的
实线 image.png 实线是实实在在的,例如继承、引用
虚线 image.png 虚线是很虚无缥缈的,例如实现关系,你都不知道谁来实现
空心三角形 image.png 类之间继承关系,指向确定的一方,例如泛化关系
实心三角形 image.png 类之间的对象引用,指向被关联的类,例如关联关系
空心菱形 image.png 较强的关联关系,在整体的一方,例如聚合关系
实心菱形 image.png 更强烈的关系关系,在整体的一方,例如组合关系

附录

请你相信我所说的都是错的