Java类之间的关联关系(转载)

Java类之间的关联关系

UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又能够细化为聚合和组合。
1、泛化(Generalization)
泛化是父类和子类之间的关系,子类继承父类的全部结构和行为。在子类中能够增长新的结构和行为,也能够覆写父类的行为。
通常用一个带空心箭头的实线表示泛化关系,UML图以下:

工具

泛化对应Java中继承关系,即子类继承父类中出private修饰外的全部东西(变量、方法等)。示例代码:
public class Animal {
}
public class Tiger extends Animal {
}
Tiger继承Animal,所以Tiger与Animal之间是泛化(继承)关系。这个很好理解。

2、依赖(Dependency)
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立。在你想显示一个事物使用另外一个事物时使用。
通常用一条指向被依赖事物的虚线表示,UML图以下:


一般状况下,依赖关系体如今某个类的方法使用另外一个类做为参数。代码示例:spa

public class Screwdriver {    //螺丝刀,做为人类的工具,是用来被人类使用的
}
public class Person{
       public void screw(Screwdriver src){    //拧螺丝,需使用螺丝刀
}
}

Person类的screw()方法在使用时就得传入一个Screwdriver类型的参数,这样Screwdriver的改变就会影响到Person,所以Person与Screwdriver之间就是依赖关系(Person依赖于Screwdriver)。
3、关联(Association)
是一种结构关系,说明一个事物的对象与另外一个事物的对象相联系。给定有关联的两个类,能够从 一个类的对象获得另外一个类的对象。关联有两元关系和多元关系。两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系。两个类之间的简单关联表示 了两个同等地位类之间的结构关系。当你想要表示结构化关系时使用关联。(能够想一想Hibernate的关联关系)
通常用实线链接有关联的同一个类或不一样的两个类。UML图以下:

.net

一般状况下,关联关系是经过类的成员变量来实现的。代码示例:
public class Company {   //公司
private Employee emp ;  //一个公司雇员,公司与雇员之间就是一种关联关系。
}
public class Employee{
}
雇员做为公司的属性,不一样于上面的依赖。依赖的话,雇员的改变会影响公司,显然不是。在这里雇员仅仅做为公司的一个属性而存在。所以Employee与Company之间是关联关系。关联关系还能够细分为聚合和组合两种。

3.1  聚合(Aggregation)对象

聚合是一种特殊的关联。它描述了“has a”关系,表示总体对象拥有部分对象。
关 联关系和聚合关系来语法上是没办法区分的,从语义 上才能更好的区分二者的区别。聚合是较强的关联关系,强调的是总体与部分 之间的关系。例如,学校和学生的关系。聚合的总体和部分之间在生命周期上没有什么必然的联系,部分对象能够在总体对象建立以前建立,也能够在总体对象销毁 以后销毁。
通常用带一个空心菱形(总体的一端-学校)的实线表示。UML图以下:

 

与关联关系同样,聚合关系也是经过类的成员变量来实现的。示例代码:
public class Student{
}
public class School{  
       private List<Student> students ;  //学校与学生是聚合关系
}

学校是总体,而学生是部分。学校与学生都是能够独立存在的,之间没有什么必然的联系。所以学校与学生就是聚合关系。
3.2  组合(Composition)blog

组合是聚合的一种形式,它具备更强的拥有关系,强调总体与部分的生命周期是一致的,总体负责部分的生命周期的管理。 生命周期一致指的是部分必须在组合建立的同时或者以后建立,在组合销毁以前或者同时销毁,部分的生命周期不会超出组合的生命周期。例如Windows的窗 口和窗口上的菜单就是组合关系。若是总体被销毁,部分也必须跟着一块儿被销毁,若是全部者被复制,部分也必须一块儿被复制。
通常用带实心菱形(总体的一端)的实线来表示。UML图以下:
与关联关系同样,组合关系也是经过类的成员变量 来实现的。示例代码:
public class Menu{
}
public class Window{
       private List<Menu> menus ;
}
菜单的存在前提是窗口的存在,二者之间存在很强的拥有关系。且窗口对菜单的生命周期负责,只有在窗口建立以后,菜单才可以建立,菜单必须在窗口销毁以前销毁。所以Window与Menu之间是组合关系。
聚合和组合的区别在于:
聚 合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示总体与部分的关系比较弱,而组合比较强;聚合关系中表明部分事物的对 象与表明聚合事物的对象的生存期无关,一旦删除了聚合对象不必定就删除了表明部分事物的对象。组合中一旦删除了组合对象,同时也就删除了表明部分事物的对 象。
另外有一个差异是组合中的一个对象在同一时刻只能属于一个组合对象,而聚合的一个部分对象能够被多个总体对象聚合,例如一个学生能够在多个学校就读,而一个菜单在同一时刻只能是某个窗口内的对象。

4、实现(Realization)
实现关系指定两个实体之间的一个合约。换言之,一个实体定义一个合约,而另外一个实体保证履行该合约。对类来讲,就是一个类实现了一个接口。
通常用一条指向接口的虚线表示,UML图以下:


实现对应Java中的实现接口(implements)。示例代码:
public interface Person{
}
public class Student implements Person{
}
这个和泛化同样很好理解。
5、总结
类间关系有不少种,在大的类别上能够分为两种:纵向关系、横向关系。纵向关系就是继承关系,它的概念很是明确,也成为OO的三个重要特征之一,这里不过多的讨论。
横向关系较为微妙,按照UML的建议大致上能够分为四种:
依赖    (Dependency)
关联    (Association)
聚合    (Aggregation)
组合    (Composition)
关于关联,聚合,组合在实现上并无显著区别,相区别他们只有经过判断关系双方之间的实际关系,如关系强弱、建立与销毁之间有无必要关联等。
它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合<泛化(继承)
实现方式区别:
(1)    依赖关系:关系对象出如今局部变量或者方法的参数里,或者关系类的静态方法被调用
(2)    关联关系:关系对象出如今实例变量中
(3)    聚合关系:关系对象出如今实例变量中
(4)    合成关系:关系对象出如今实例变量中
(5)    Generalization: extends
(6)    实现: implements

原文出处:http://blog.csdn.net/hqshaozhu/article/details/7583545继承

相关文章
相关标签/搜索