- 依赖 --- 局部变量,方法的形参,静态方法
- 关联 ,聚合,组合--- 成员变量
聚合和组合都是关联的一种
聚合和组合的区别:
聚合是个体离开了整体,依然可以存在. 组合是个体和整体不可以分开,个体不能离开整体单独存在.
依赖,关联 和聚合,组合的区别:
依赖,关联 : 类之间的关系是在同一层次上. 聚合,组合: 类之间的关系表现为整体和部分.
依赖(Dependency)
是类于类之间的联接,表示一个类依赖于另一个类的定义;依赖关系仅仅描述了类与类之间的一种使用与被使用的关系;
例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
例如 ,我要过河,没有桥怎么办,我就去借来一条小船渡过去。我与小船的关系仅仅是使用(借用)的关系。表现在代码上,为依赖的类的某个方法以被依赖的类作为其参数。或者是class A 的某个方法创造了 class B 的实例抑或对class B的静态方法的调用。如果A依赖于B,那意味着B的变化可能要求A也发生变化;
class Person{ //person依赖于boat
public void crossRiver(Boat boat){
boat.row() ;
}
public void fishing(){
Boat boat = new Boat() ;
boat.row() ;
}
public void patrol(){
Boat.row() ;
}
}
关联(Association)
含义:类于类之间的连接,关联关系使一个类知道另一个类的属性和方法;通常含有"知道","了解"的含义.关联可以是单向的,也可以是双向的,关联关系在java上是通过成员变量来体现的
例如:客户和订单的关系以及公司和员工的关系,都是关联关系。还有就是我和我的单车的例子,他们都是一种“拥有”的关系。表现在代码上,就是一个类包含另一个类的实例,通常表现为被关联类以类属性的形式出现在关联类的类定义中,也可以表现为关联类引用了一个类型为被关联类的全局变量。关联可以使单向的,也可以使双向的。
依赖和关联的区别在于依赖是使用,关联是拥有.
聚合(Aggregation) 关系是关联关系的一种,是强的关联关系(has-a)。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
图示:空心菱形 + 实线 + 箭头;箭头指向被聚合的类,也就是说,箭头指向个体/部分;
组合(Composition):
含义:它也是关联关系的一种(is-a),但它是比聚合关系更强的关系.组合关系要求聚合关系中代表整体的对象要负责代表个体/部分的对象的整个生命周期;组合关系不能共享;在组合关系中,如果代表整体的对象被销毁或破坏,那么代表个体/部分的对象也一定会被销毁或破坏,而聚在合关系中,代表个体/部分的对象则有可能被多个代表整体的对象所共享,而不一定会随着某个代表整体的对象被销毁或破坏而被销毁或破坏;
体现:在Java组合关系是通过成员变量来实现的;
图示:实心菱形 + 实线 + 箭头;箭头指向代表个体/部分的对象,也就是被合成/组合的类的对象;
举例:一个人由头、四肢、等各种器官组成,因为人与这些器官具有相同的生命周期,人死了,这些器官也挂了;房子和房间的关系,当房子没有了,房间同样不可能单独存在。
UML图表示的组合关系: