UML 类图详解
转载来源:http://blog.csdn.net/shift_wwx/article/details/79205187
可以参考:http://www.uml.org.cn/oobject/201211231.asp
一、前言
在软件开发过程中会经常整理文档,不是所有的信息都可以通过文字来表达,而换成图之后会更加的直观、有效,其中频繁使用的就是UML图。结合自己实践总结一下,希望对大家都能有所帮助。
本文中的UML图都是用visio 绘制,source code展示是Java 语言。
二、UML简介
Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。 面向对象的分析与设计(OOA&D,OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。
UML图包括两个范畴:结构图和行为图。
结构图的目的是显示建模系统的静态结构。它包括类、组件和对象。例如UML静态结构图。
行为图的目的是显示系统中对象的动态行为。它包括对象的方法、协作和活动之类的内容。例如UML示例图、UML活动图、UML序列图。
三、UML类图
通过UML类图可以将类之间的所有关系(泛化、实现、关联、聚合、组合、依赖)都能具体的体现出来。
1、类图的表示
类的 UML 表示是一个长方形,垂直地分为三个区,如下图所示。顶部区域显示类的名字。中间的区域列出类的属性。底部的区域列出类的操作。在一个类图上画一个类元素时,你必须要有顶端的区域,下面的二个区域是可选择的(当图描述仅仅用于显示分类器间关系的高层细节时,下面的两个区域是不必要的)。
顶端是类名,中间列出的是类的属性。底部列出的是类的操作。在绘制类图的时候,顶端部分是必须的,其他两个部分可选。
类名:如果是抽象类,采用斜体。
类属性列表:可见性 + 属性名 + 冒号 + 属性类型 + (等号 + 默认值)
属性的可见性下面会说明;属性的类型看属性而定,可以是int,可以是boolean;有的属性可能会有默认值,在类型之后加等号和默认值。
类方法列表:可见性 + 函数名 + (参数列表) + 冒号 + 返回值类型
可见性:
标志 | 可见性类型 |
+ | public |
- | private |
# | protected |
~ | package |
2、继承的表示
为了在一个类图上建模继承,从子类(要继承行为的类)拉出一条闭合的单键头(或三角形)的实线指向超类。
ViewGroup 和 方法onLayout 用的是斜体,说明ViewGroup 是抽象类,方法onLayout 是抽象的。
3、接口的表示
一个类和一个接口不同:一个类可以有它形态的真实实例,然而一个接口必须至少有一个类来实现它。在 UML 中,一个接口被认为是类建模元素的特殊化。因此,接口就象类那样绘制,但是长方形的顶部区域也有文本“interface”。
对于接口,如果用<< 和 >>将字符串interface包起来,表示这是个接口类。并且用虚线带三角形的箭头从实现类指向Interface 类。
4、关联的表示
(1)双向关联
在两个类之间用实线连接,表示两个类彼此都知道它们之间的联系。
在实线的上端写上关联关系,例如 has;在实线的下端写上可能的多重值,多重值表示如下:
表示 | 含义 |
0..1 | 0个或者1个 |
1 | 只能1个 |
0..* | 0个或者多个 |
* | 0个或者多个 |
1..* | 1个或者多个 |
3 | 只能3个 |
0..3 | 0至3个 |
3..13 | 3至13个 |
(2)单向关联
单向关联是用一个实线带一个开放的箭头,表示一端知道箭头指向的另一端。
上图中View 中包含Canvas 类,而Canvas 中不需要包含View。
5、聚合的表示
聚合是一种特别类型的关联,用于描述“总体到局部”的关系。在基本的聚合关系中,部分类的生命周期独立于整体类的生命周期。用一个带空心的菱形的实线表示,菱形指向的是整体的类。
例如,汽车和轮子的关系:
聚合与单向关联的区别在于:单项的关联可能只是一个简单的“包含、引用”关系,关联和被关联类之间在逻辑概念上不一定有紧密的联系,而聚合则不同,它表示的是一种内在关系紧密,相互依存,相互包含的概念,其中的一部分是构成另外一部分的不可或缺的成分。
6、组合的表示
组合聚合关系是聚合关系的另一种形式,但是子类实例的生命周期依赖于父类实例的生命周期。
用一个带实心的菱形的实线表示,菱形指向的是整体的类。
组合跟聚合有很大的不同,聚合的部分的生命周期独立于整体,整体结束那不影响部分。而组合是部分的生命周期依赖与整体,整体结束,部分没有必要存在。就想公司和部分,公司都不存在了,那部门就没有存在的必要了,解散了算。
同样用View 为例:
其中的DeclaredOnclickListener 类是View的一部分,而且是依赖View的生命周期。
7、依赖的表示
依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系,大多数情况下依赖关系体现在某个类的方法使用另一个类的对象作为参数。在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
依赖关系通常通过三种方式来实现:
- 将一个类的对象作为另一个类中方法的参数
- 在一个类的方法中将另一个类的对象作为其对象的局部变量
- 在一个类的方法中调用另一个类的静态方法
关联关系、聚合、组合之间的区别:
关联关系跟突出的是has,只是has的关系,可以通过这一层关系调用到另一个对象中的某个方法。
聚合、组合更突出“整体-部分”的关系,不单单是“拥有”,部分类是构成整体类的一部分。
对于聚合、组合,区别就在于部分类的生命周期如何,如果部分类还可以独立存在,那属于聚合关系;如果部分类不能独立存在,那属于组合的关系。