摘自
依赖 < 关联 < 聚合 < 组合
- 依赖(Dependency):语义“a uses b”,a依赖于b,但不持有b的引用;比如:现实世界的例子有“人对空气的依赖关系”,在程序中a.f(b)可以理解为a对b的依赖(或者说对b的类型B的依赖),b作为a的方法参数,a内部成员变量不引用b。UML符号:


- 聚合(Aggregation):语义“a owns b”,a拥有b的引用,且有从属关系,二者的耦合比关联更强,但a并不负责b的生命周期。在程序中,b并非a专有的内部实现细节;除a以为,外部也可能引用b。比如,”汽车和轮胎关系”,汽车不负责轮胎的生产,汽车报废了轮胎或许还可以继续使用。UML符号:

- 组合(Composition):语义“b is a part of a”,a不仅拥有b的引用,还应该全权负责b的整个生命周期,在程序中b通常是a的内部实现细节,不暴露给外部;比如本文中人与心脏的关系。UML符号:

我们注意这四种关系中有一个关键的概念“对象生命周期”,在建模时辨别清楚对象生命周期就不难选择采用DI还是创建对象。DI意味着使用者不负责依赖对象的生命周期,创建对象则相反。对应到上面的4种横向关系,我们一般可以这样处理:第1种依赖关系不需要DI也不需要创建对象;第2,3种关联和聚合关系适合采用DI方式,最后一种组合关系适合采用创建对象方式。