说点废话:大学学习UML的时候一点都不用心,感觉不如学个JSP能直接写个网站出来,就把该学UML的时间用在了学做网站上,不过当时UML确实没用=_=。现在接触的东西越来越多,如果分析一些大的开源框架,即使不用画特别复杂的图的话,也要画出基本的类的继承关系和依赖关系吧。现在必须学习一下了0.0
说到UML,像我这样的业余画UML图的人,大多数时候在看源码库时喜欢用手画,对于工具也喜欢简洁的UML工具。这里推荐两个在线的画UML图的工具,当然这两款工具不仅仅只能画UML。
- genmymodel
- processon
- MacOS上还有一个叫StarUML的客户度也还不错
前者是国外开发的,后者是国内的,相对来说我喜欢前者,但是有时候网速不好=_=,前者操作舒服并且画出的图也好看些,具体看自己选择,还有很多可以用的客户端工具就不介绍了。
类之间可描述的关系大概有下面几种:继承、实现、依赖、关联、聚合、组合关系的总览图如下:
继承(也叫泛化generalization)
用于Interface和Interface之间,或者用于Class和Class之间,如下图:
图中用java中常见的List集合的继承关系做为例子,List(子接口)接口继承自Collection接口(父接口),而ArrayList类(子类)继承自AbstractList(父类)这个抽象类。java 用extends关键字
实现(Realization)
指的是一个class类实现interface接口(可以是多个)的功能;在Java中此类关系通过关键字implements明确标识,如下图:
依赖(Dependency)
从字面理解的话,是说一个类用到了另一个类。这种使用关系是具有偶然性的、临时性的、非常弱的。比如下图中的依赖关系,司机开车,要依赖车。在代码上表现的话一般为函数参数
,或者局部变量
或者对静态方法的调用
。如下图的UML类图中Driver 对Car的依赖就是通过函数参数
的方式。注意依赖关系只能是单向的,并且依赖关系强调的是**使用上的关系 **。
关联(association)
- 关联关系强调的是一种结构上的关系
- 他可以是单向的或者双向的
- 从语义级别(上下文)可以分为
聚合
和组合
,在代码实现上关联 和聚合是很像的,主要区别在语义上 - 一般来说双方关系是平等的,比如
我和我的朋友
- 在java语言上一般表现为全局变量
- 如person类和company类,顾客和地址,客户和订单
重数性关联: 重数性关联关系又称为多重性关联关系(Multiplicity),表示一个类的对象与另一个类的对象连接的个数。在UML中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
聚合(aggregation)
- 是关联的一种特例
- 聚合是整体和个体之间的关系。是
has-a
的关系 - 整体和部分可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享
- 比如汽车和引擎,就是一种聚合关系,或者电脑和CPU
//汽车和引擎是一种聚合关系,java代码表现形式如下
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
……
}
public class Engine {
……
}
组合(composition)
- 也是关联的一种特例
- 是一种强聚合,表示一种
contains-a
的关系 - 部分不能脱离整体而存在,整体的生命周期结束也就意味着部分的生命周期结束
- 比如人和腿的关系,腿不能脱离人单独存在,腿的生命周期也不能别人这个整体还长。还有人和大脑,大雁与翅膀
//人和嘴是一种组合关系
public class Person {
private Mouth mouth;
public Person() {
mouth = new Mouth();
}
……
}
public class Mouth {
……
}
【参考文章】