为什么我突然想写一篇关于uml图的文章呢,因为我发现,作为一位程序员这是不可缺少的技能,为什么这么说?你有没有发现你阅读的技术文档都能看到uml图,所以最起码的用例图、类图和时序图得要能看得懂,不然这将是你进阶路上的拦路虎。
UML中的图
UML1.4中提供9种常用图:用例图、类图、对象图、状态图、活动图、时序图、协作图、组件图,配置图。
本篇文章只介绍其中的用例图、类图和时序图,因为这是我最经常遇到的。
UML-用例图
用例图(User Case)是外部用户(参与者)所能观察到的系统功能的模型图。用例图呈现了一些参与者,一些用例,以及它们之间的关系,主要用于对系统、子系统或类的功能行为进行建模。
参与者:特指使用系统的角色,如系统的终端用户。
用 例:系统的一个操作或称为功能,如登录操作、注册操作都是一个用例。
例:ATM取款机使用用例
UML用例图中的关系:
1、泛化关系
子用例将继承基用例的所有行为,关系和通信关。泛化关系在用例图中使用空心的箭头表示,箭头方向从子用例指向基用例。
2、扩展(extend)
extend关系是对基用例的扩展,基用例是一个完整的用例,即使没有子用例的参与,也可以完成一个完整的功能。 extend关系在用例图中使用带箭头的虚线表示(在线上标注<>),箭头从子用例指向基用例。
3、包含(include)
include为包含关系,当两个或多个用例中共用一组相同的动作,这时可以将这组相同的动作抽出来作为一个独立的子用例,供多个基用例所共享。因为子用例被抽出,基用例并非一个完整的用例,所以include关系中的基用例必须和子用例一起使用才够完整,子用例也必然被执行。include关系在用例图中使用带箭头的虚线表示(在线上标注<>),箭头从基用例指向子用例。
UML-类图
类图在UML的9个图中占据了一个相当重要的地位,建模工具也主要根据类图来产生代码。
类是具有相似结构、行为和关系的一组对象的描述符,类图显示了一组类、接口、协作以及他们之间的关系。
类的UML表示:
类之间的关系:
类之间的关系主要包含关联关系、聚合关系、组合关系、依赖关系、泛化关系和实现关系:
1、关联关系
一种对象(类)与另一种对象(类)有联系,这种联系可能是单向的也可能是双向的。
【表示方式】在UML图中用直线表示双向关联关系,直线加箭头表示单向关联关系。
上图中,一位教师教多名学生,一名学生上多位教师的课程,所以教师与学生是双向关联关系,可以用双箭头也可以省掉,一般都是用一条直线连接。一位教师可以授多门课程,学生每个学期都要修好几门课程,所以教师与课程,学生与课程之间都是单向关联关系。
2、聚合关系
聚合关系是关联关系的一种。聚合表示类与类之间的关系是整体与部分的关系,即整体由一个或多个部分的元素聚合而成,部分可以离开整体而单独存在。
【表示方式】在UML图中用一端带有空心小菱形的直线表示,小菱形端连接表示整体事物的元素,另一端连接表示部分事物的元素。
上图中,轮胎与发动机都是汽车的组件,轮胎离开了汽车还是轮胎,发动机离开了汽车还是发动机,也就是说轮胎与汽车、发动机与汽车之间是聚合关系。
3、组合关系
组合关系也是关联关系的一组,是比聚合关系还要强的关联关系。组合关系跟聚合关系一样,类与类之间的关系是整体与部分的关系,即整体由一个或多个部分的元素组合而成,但组合关系与聚合关系不同的是组合关系中的部分不能离开整体而单独存在。
【表示方式】在UML图中用一条带有实心小菱形的直线表示,小菱形端连接整体,另一端连接表示组成部分。
上图中,公司由各个部门组成,但是部门不能脱离公司而单独存在,这种强关联关系为组合关系。
4、依赖关系
依赖关系描述两种对象(类)之间的关系,其中一种对象是独立存在的,而另一种对象的存在必须依赖独立存在的对象,其会受独立对象的改变的影响。
【表示方式】在UML图中用一条带有箭头的虚线来表示,箭头指向被依赖的一方。
上图中,汽车必须依赖汽油才能行驶,一般来说,一辆汽车的百公里平均耗油是稳定的,汽油价格上涨则汽车行驶同样的一段路程将会耗费更多的资金。养车也是难呀。
5、泛化关系
泛化关系可以理解为java中的继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
【表示方式】在UML图中用一条带有空心箭头的实现来表示,空心箭头指向父类。
交通工具有很多,如动车,飞机,自行车,火车等。上图中,汽车是一种交通工具,汽车具有交通工具的特性如在空间中移动,也具有自己的特性。
6、实现关系
实现关系将一种类与另一种接口连接起来,其中接口只是行为的说明而不是结构或者实现,真正的实现由前面的类来完成。
【表示方式】在UML图中用一条带有空心箭头的虚线来表示,箭头指向接口。
例:这是自定义的一个java线程池的类图
UML-时序图
时序图是一种强调时间顺序的交互图,在时序图中,首先把参与交互的对象放在图的上方,沿X轴方向排列。通常把发起交互的对象放在左边,较下级对象依次放在 右边,然后把这些对象发送和接受的消息沿Y轴方向按时间顺序从上到下放置。这样就提供了控制流随着时间推移的清晰的可视化轨迹。
角色:系统角色,可以是人或者其他的系统或者子系统。
对象:对象包括三种命名方式:
- 包括对象名和类名;
- 只显示类名不显示对象名,即表示他是一个匿名对象;
- 只显示对象名不显示类明。
生命线:生命线在顺序图中表示为从对象图标向下延伸的一条虚线,表示对象的生命周期。
控制焦点:是顺序图中表示时间段的符号,用小矩形表示。在这个时间段内对象将执行相应的操作。
消息:
- 同步消息:发送者发送消息给接收者,然后停止活动,等待消息的接收者放弃或者返回控制。
- 异步消息:发送者发送消息给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。
- 自关联消息:表示方法的自身调用以及一个对象内的一个方法调用另外一个方法。
例: