组合关系比依赖关系耦合性更强
首先说明,在这里我把“关联”、“组合”、“聚合”关系都统一当做“组合”关系来说的,但实际上聚合(has-a)是关联的一种,组合(cntains-a)也是关联的一种。如果想要知道三者之间的区别,详见这篇博客:
依赖、关联、聚合和组合之间区别_玛丽莲茼蒿的博客-CSDN博客关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。https://blog.csdn.net/qq_44886213/article/details/127332726?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127332726%22%2C%22source%22%3A%22qq_44886213%22%7D
组合关系直接把类B的实例作为自己的成员变量,意思是我拥有了它,它必须作为我必不可而少的部件。
依赖关系只是在自己的成员方法中用到了类B,意思是我使用了它,但我不一定拥有它。
还是拿【司机】和【车】来举例。
如果采用组合关系,意思是,“我有一辆车,这辆车是我的了,我开我自己的车”
class Car{
public void run(){
System.out.println("在跑了在跑了");
}
}
class Driver{
Car myCar; //这辆车是我的
public void drive(){
myCar.run();
}
}
如果采用依赖关系,意思是“我开走了一辆车,但这辆车不一定是我的”
class Car{
public void run(){
System.out.println("在跑了在跑了");
}
}
class Driver{
public void drive(Car car){ //这辆车不一定是我的,反正我开跑了
car.run();
}
}
在实际开发中如何选择用依赖关系还是组合关系呢?
根据耦合性有强到弱的关系:继承∣实现→组合→聚合→关联→依赖
因为组合关系比依赖关系的耦合性更强,这也就要求我们能用依赖关系就不要用组合关系,
但有的时候类B必须作为类A的一个部件(类A必须拥有类B),就得用组合关系了(见策略模式中Duck和Character的例子)。
举一个更贴切的例子,Person类和Arm类就必须是组合关系,因为一个人必须有自己的胳膊,不能说我用胳膊实现抬手这个动作的时候就通过形参随便拿别人的胳膊用一用。