分别介绍这几种关系:html
UML关系:继承(泛化)、实现、依赖、关联、聚合、组合的联系与区别java
1、表示符号上的区别spa
2、具体区别与联系 .net
1. 继承/泛化(Generalization)设计
【泛化关系】:是一种继承关系,表示通常与特殊的关系,它指定了子类如何特化父类的全部特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。继承是类与类或者接口与接口之间最多见的关系;在Java中此类关系经过关键字extends明确标识,在设计时通常没有争议性。htm
【箭头指向】:带三角箭头的实线,箭头指向父类对象
2.实现(Realization)blog
【实现关系】:是一种类与接口的关系,表示类是接口全部特征和行为的实现. 一个class类实现interface接口(能够是多个)的功能;实现是类与接口之间最多见的关系;在Java中此类关系经过关键字implements明确标识,在设计时通常没有争议性;继承
【箭头指向】:带三角箭头的虚线,箭头指向接口接口
3.依赖(Dependency)
【依赖关系】:是一种使用的关系,即一个类的实现须要另外一个类的协助,因此要尽可能不使用双向的互相依赖. 一个类A使用到了另外一个类B,而这种使用关系是具备偶然性的、临时性的、很是弱的,可是B类的变化会影响到A;好比某个老师要授课,则须要有这么一门课让他教授,此时老师与课之间的关系就是依赖;
【代码表现】:局部变量、方法的参数或者对静态方法的调用
【箭头及指向】:带箭头的虚线,指向被使用者
4.关联(Association)
【关联关系】:是类与类之间的联接,它使一个类知道另外一个类的属性和方法。两个类或者类与接口之间语义级别的一种强依赖关系,这种关系比依赖更强,通常是长期性的,并且双方的关系通常是平等的。好比:老师与学生,丈夫与妻子关联能够是双向的,也能够是单向的。双向的关联能够有两个箭头或者没有箭头,单向的关联有一个箭头。
【代码体现】:成员变量/全局变量
【箭头及指向】:带普通箭头的实心线,指向被拥有者
上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。
下图为自身关联:
5.聚合(Aggregation)
【聚合关系】:关联关系的一种特例, 是强的关联关系. 聚合是总体与部分的关系,且部分能够离开总体而单独存在,他们能够具备各自的生命周期,部分能够属于多个总体对象,也能够为多个总体对象共享,好比计算机与CPU、公司与员工、车和轮胎的关系等;表如今代码层面,和关联关系是一致的,只能从语义级别来区分;
聚合关系也是使用实例变量实现的. 从java 语法上是分不出关联和聚合的. 关联关系中两个类是处于相同的层次, 而聚合关系中两不类是处于不平等的层次, 一个表示总体, 一个表示部分.
【代码体现】:成员变量/全局变量
【箭头及指向】:带空心菱形的实心线,菱形指向总体
6.组合(Composition)
【组合关系】:也是关联关系的一种特例,是比聚合关系还要强的关系,也称为强聚合;他一样体现总体与部分间的关系,但此时总体与部分是不可分的,总体的生命周期结束也就意味着部分的生命周期结束;好比:公司和部门是总体和部分的关系,没有公司就不存在部门合成关系不能共享。
组合跟聚合几乎相同,惟一的区别就是"部分"不能脱离"总体"单独存在,就是说,"部分"的生命期不能比"总体"还要长。
【代码体现】:成员变量/全局变量
【箭头及指向】:带实心菱形的实线,菱形指向总体
各类关系的强弱顺序:
泛化=实现>组合>聚合>关联>依赖
下面这张UML图,比较形象地展现了各类类图关系:
3、综合比较
1.聚合与组合
(1)聚合与组合都是一种结合关系,只是额外具备总体-部分的意涵。
(2)部件的生命周期不一样
聚合关系中,整件不会拥有部件的生命周期,因此整件删除时,部件不会被删除。再者,多个整件能够共享同一个部件。
组合关系中,整件拥有部件的生命周期,因此整件删除时,部件必定会跟着删除。并且,多个整件不能够同时间共享同一个部件。
(3)聚合关系是"has-a"关系,组合关系是"contains-a"关系。
2.关联和聚合
(1)表如今代码层面,和关联关系是一致的,只能从语义级别来区分。
(2)关联和聚合的区别主要在语义上,关联的两个对象之间通常是平等的,例如你是个人朋友,聚合则通常不是平等的。
(3)关联是一种结构化的关系,指一种对象和另外一种对象有联系。
(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是必定要组合在汽车类中的,由于它离开了汽车就没有意义了。可是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就能够用聚合了。
3.关联和依赖
(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,好比我和个人朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,通常是长期性的,并且双方的关系通常是平等的。
(2)依赖关系中,能够简单的理解,就是一个类A使用到了另外一个类B,而这种使用关系是具备偶然性的、临时性的、很是弱的,可是B类的变化会影响到A。
4.综合比较
这几种关系都是语义级别的,因此从代码层面并不能彻底区分各类关系;但总的来讲,后几种关系所表现的强弱程度依次为:
组合>聚合>关联>依赖
结合了两篇博客以下:
http://blog.sina.com.cn/s/blog_94c2c46a0102vaiz.html
http://blog.csdn.net/wzjking0929/article/details/51803110