UML类图与类关系

一、写在前面的话
类关系一般有6种:继承,实现,依赖,关联,聚合,组合。
类关系有各自的表示符号,建议牢牢记住这些符号,因为咱们除了要自己掌握画UML类图以外,其实大部分的时间是在阅读别人已经画好的UML类图,所以牢记这些基础知识,掌握这些符号代表的含义,可以帮助我们快速准确地理解UML类图。

二、类关系详解
1、继承(Generalization)
也叫泛化, 继承表示一般与特殊的关系,它指定了子类如何特殊化父类的所有特征和行为 。详细点说,指的是一个类继承另一个类的功能,或是一个接口继承另一个接口,是类与类或者接口与接口之间最常见的关系,注意一定是发生在类和类,接口和接口之间的关系,在Java中此类关系通过关键字extends明确标识。
符号为带三角箭头的实线,箭头指向父类,如下图所示:

2、实现(Realization)
一种类和接口的关系,表示类是接口所有特征和行为的实现,在Java中用关键字implements明确标识。
符号为带三角箭头的虚线,箭头指向接口,如下图所示:
UML类图与类关系_第1张图片

3、依赖(Dependency)
一种使用的关系,即一个类的实现需要另一个类的协助,可以简单的理解就是一个类A使用到了另一个类B,而这种关系是具有偶然性的,临时性的,非常弱的,仅仅是调用一下,但是B的变化会影响到A。
表现在代码层面:局部变量,方法的参数或者静态方法的调用。
符号为带箭头的虚线,指向被使用者,如下图所示:

示例图:这里只是Animal的run方法里需要使用Running接口,所以这里的关系应用使用依赖。

4、关联(Association)
一种拥有关系,它使一个类知道另一个类的属性和方法,体现的是两个类,或者类和接口之间语义级别的一种强依赖关系;这种关系比依赖更强,不存在依赖关系的偶然性,关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的,关联可以是单向的、双向的;
表现在代码层面,为被关联类B以类属性的形式出现在关联类A中(即类B为类A的成员变量)。
符号有两种,都是普通箭头的实心线,双向关联可以有两个箭头或者没有箭头。单向关联有一个箭头,指向被拥有者,如下图所示:
UML类图与类关系_第2张图片
示例图:老师和学生的关系的双向的,所以用实心线即可,学生和课程的关系是单向的,用单向关联的箭头就好了。

5、聚合(Aggregation)
是整体与部分的关系,has-a的关系,并且部分可以离开整体而单独存在,他们可以是具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
聚合关系是关联关系的一种,是强的关联关系,关联和聚合在语法上无法区分,必须考察具体的逻辑关系。
符号为带空心菱形的实心线,菱形指向整体,箭头指向部分,如下图所示:
UML类图与类关系_第3张图片
示例图:一辆车拥有四个轮子,车和轮子是整体与部分的关系。

6、组合(Composition)
也是整体与部分的关系,体现的是一种contains-a的关系,部分不能离开整体而单独存在,整体的生命周期结束也就意味着部分的生命周期结束。
这种关系比聚合更强,也称为强聚合,表现在代码层面,和关联关系是一致的(也是成员变量),只能从语义级别来区分。
符号为带实心菱形的实线,菱形指向整体,箭头指向部分。

示例图:一棵树包含树根和叶子等,属于包含关系,也是整体和部分的关系。

三、总结与区分
继承和实现体现是的一种类与类,或者类与接口间的纵向关系,较好区分,其他四个则是体现类与类,类与接口的引用,横向关系,还是比较难区分的,尤其是关联,聚合,组合这样的语义级别的,代码层面并不能完全区分这三种关系,只能通过语义分析,逻辑分析来判断,但总的来说,这四种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。
关联与聚合、组合的区别:关联一般是描述两个相对独立的个体的平等关系(如例子中的老师和学生,都是相互独立的个体,只是由于教学需要而产生师生关系),聚合和组合则描述整体与部分的关系。
聚合与组合的区别:聚合与组合唯一的差别在于是否分享,聚合关系中的部件可以与其他类分享,但组合是不能分享的。

你可能感兴趣的:(UML,类关系,架构设计基础)