前言
最早了解UML类图是《大话设计模式》中,但后来在工作中压根就没画过UML类图,直到最近在看源码和设计模式时发现——太重要了!利用UML类图,可以使整个架构设计更清晰,类与类之间的关系一目了然。
UML简介
UML(Unified Modeling Language)统一建模语言。可以用来对复杂系统进行建模,而我们Java平常说的UML类图只是UML模型中图形表达方式之一,它还有例图、协作图、活动图、序列图、部署图、构件图、状态图等。因此需要再次说明,我们本篇讲的是UML类图,不要把概念搞混了。
类、接口的表示
图片来源:《大话设计模式》
这是一张经典的UML类图,我们将会围绕这张图进行介绍UML类图中一些常用的表现形式。
类的表示
一个类由三部分组成,类的名称、类的属性(成员变量)、类的方法。
(普通类)
(抽象类)
(接口)
类的名称
类的名称就是一个字符串,抽象类用斜体表示,接口用<<>>表示
类的属性
类的属性格式如下:
[可见性]属性名:类型[=默认值]
可见性:也就是Java中的public、private、protected,default分别对应UML中的+、-、#、~
例如:
- water:int // 等于Java中的 private int water;
类的方法
类的方法格式如下:
[可见性]方法名称(参数列表)[:返回类型]
注:抽象方法用斜体来表示
例如:
+ say(String msg):void
其它
静态类型也就是static修饰的会用下划线来表示
类之间的关系
依赖关系
是一种使用关系,是临时性的关联,非常弱的关系。可以理解为一个类用到了另一个类中的方法和属性。因为是一种弱关系所以使用虚线;它是被人用的,但是不知道被谁用,所以箭头指向确定的一方。例如:箭头指向被使用者Phone类,Person使用Phone。
依赖关系
关联关系
是对象之间的引用关系,是最常用的一种关系,关联关系可以分为一般关联关系、聚合关系、组合关系。
一般关联关系
对象与对象之间的引用关系,因此可以使单向的也可以是双向的,双向可以用两个实心箭头或者不用实心箭头,单向实心箭头则指向被关联类。例如:Student引用了Teacher所以箭头指向Teacher。
一般关联关系
聚合关系
是强关联关系,是整体和部分之间的关系,是 has-a 的关系。整体和部分是可以分离的,有各自的生命周期。菱形在整体的一边,因为是强关系所以也用实线。例如:学校和老师的关系
聚合关系
组合关系
也表示类之间的整体与部分的关系,但它是一种更强烈的聚合关 系,是 cxmtains-a 关系,整体可以控制部分的生命周期,整体一旦不存在,部分也不存在。实心菱形在整体一边,因为是强关系所以也用实线。例如:翅膀和鸟的关系。
泛化关系
是耦合度最高的一种关系,是is-a关系,是继承关系,是父与子的关系。空心三角形表示继承,其中箭头始终指向确定的一方,父类是确定的,而子类是不确定的;继承是很实实在在的所以用实线。例如:Person和Student的关系。
泛化关系
实现关系
实现是类与接口之间的关系,实现关系用空心三角形和虚线来表示。例如猴子实现了动物接口。
小结
根据我的学习经验,这些箭头谁指向谁?什么情况用哪种符号?实心还是空心?让人头大。
但真正理解了类与类之间的关系,然后多画图,也还OK啦!为此,整理了个表格,方便快速查看 : )
名称 | 图案 | 描述 |
---|---|---|
箭头 | 指向确定性的一方,例如子类指向父类,因为父类是确定的 | |
实线 | 实线是实实在在的,例如继承、引用 | |
虚线 | 虚线是很虚无缥缈的,例如实现关系,你都不知道谁来实现 | |
空心三角形 | 类之间继承关系,指向确定的一方,例如泛化关系 | |
实心三角形 | 类之间的对象引用,指向被关联的类,例如关联关系 | |
空心菱形 | 较强的关联关系,在整体的一方,例如聚合关系 | |
实心菱形 | 更强烈的关系关系,在整体的一方,例如组合关系 |
附录
请你相信我所说的都是错的