依赖 < 关联 < 聚合 < 组合
1 依赖
语义:a use b。依赖是局部变量、形参、静态方法、返回参数
生命周期中对象依赖关系:当f方法被调用时,A与B产生依赖关系,当调用结束,依赖关系结束
class A{
void f(B b){
b.x
}
}
a 虚线箭头指向 b
2 关联
class Soldier{
private Gun gun;
public void setGun(Gun gun){
this.gun = gun;
}
}
语义:a has b
士兵可以有枪,也可以没有枪,是一种松散的耦合关系。而且士兵可以通过setGun()随时换一把枪
生命周期中对象依赖关系:士兵和枪各自不负责对方的生命周期,士兵销毁了枪任然在,枪销毁了士兵任然在。只不过只有士兵销毁后,士兵与枪的依赖关系才回解除。策略模式应当典型的关联(策略可以随时替换)
a实线箭头指向b
3 聚合
语义:a owns b
a拥有b的引用,a和b有明显的从属关系,但是a任然不负责b的生命周期的管理。b任然可能被其它的对象所引用。
聚合和关联需要根据具体语义区别,典型例子:
狼群类 和 狼 就是聚合例子。容器List和容器中的元素,应当是一种典型的聚合关系
a 空心菱形连接 b
4 组合
语义:b is a part of b
b需要负责a的生命周期的管理,例如人和人脑:
class Person{
private Brain brain;
public Person(){
brain=new Brain();
}
public Person(Brain brain){
this.brain = brain;
}
}
人脑在一般情况下,应答完全属于一个人。即使使用spring注入人脑,也应该使用构造器注入才合理,使人一旦创建,就是有脑的状态。这也说明人管理了人脑的声明周期。
a(Person)实心菱形连接 b(Heart)