Java类之间的关联关系(转载)
UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又可以细化为聚合和组合。
一、泛化(Generalization)
泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。
一般用一个带空心箭头的实线表示泛化关系,UML图如下:
二、依赖(Dependency)
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立。在你想显示一个事物使用另一个事物时使用。
一般用一条指向被依赖事物的虚线表示,UML图如下:
通常情况下,依赖关系体现在某个类的方法使用另一个类作为参数。代码示例:
Person类的screw()方法在使用时就得传入一个Screwdriver类型的参数,这样Screwdriver的改变就会影响到Person,因此Person与Screwdriver之间就是依赖关系(Person依赖于Screwdriver)。
三、关联(Association)
是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。给定有关联的两个类,可以从
一个类的对象得到另一个类的对象。关联有两元关系和多元关系。两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系。两个类之间的简单关联表示
了两个同等地位类之间的结构关系。当你想要表示结构化关系时使用关联。(可以想想Hibernate的关联关系)
一般用实线连接有关联的同一个类或不同的两个类。UML图如下:
3.1 聚合(Aggregation)
学校是整体,而学生是部分。学校与学生都是可以独立存在的,之间没有什么必然的联系。因此学校与学生就是聚合关系。
3.2 组合(Composition)
四、实现(Realization)
实现关系指定两个实体之间的一个合约。换言之,一个实体定义一个合约,而另一个实体保证履行该合约。对类来说,就是一个类实现了一个接口。
一般用一条指向接口的虚线表示,UML图如下:
实现对应Java中的实现接口(implements)。示例代码:
public interface Person{
}
public class Student implements Person{
}
这个和泛化一样很好理解。
五、总结
类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。纵向关系就是继承关系,它的概念非常明确,也成为OO的三个重要特征之一,这里不过多的讨论。
横向关系较为微妙,按照UML的建议大体上可以分为四种:
依赖 (Dependency)
关联 (Association)
聚合 (Aggregation)
组合 (Composition)
关于关联,聚合,组合在实现上并没有显著区别,相区别他们只有通过判断关系双方之间的实际关系,如关系强弱、创建与销毁之间有无必要关联等。
它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合<泛化(继承)
实现方式区别:
(1) 依赖关系:关系对象出现在局部变量或者方法的参数里,或者关系类的静态方法被调用
(2) 关联关系:关系对象出现在实例变量中
(3) 聚合关系:关系对象出现在实例变量中
(4) 合成关系:关系对象出现在实例变量中
(5) Generalization: extends
(6) 实现: implements
原文出处:http://blog.csdn.net/hqshaozhu/article/details/7583545