【Java】聚合和组合的区别

组合:部分与整体是与生俱来的,部分的存在依赖于整体。比如人与人的某个器官,人一出生,器官就在,人死亡,器官也就没了意义。

聚合:你与你的电脑(或者其它物品),电脑是属于你的吧,但是你是一出生就拥有了电脑吗,电脑是某个厂商生产出来的,然后你买过来才成为了你的一部分。你死了以后,电脑也可以送给别人继续用啊!这就不叫做其存亡了,所以这是聚合。

这个是结合我之前看过的设计模式所想到的,如果你了解过设计模式,则会更容易明白我说的是什么了,比如有一种设计模式叫做责任链模式,责任链中的处理者往往是先创建出来,然后再把引用传到另一个责任处理对象作为责任接班人,这就用到了聚合的思想吧。

另外,《thinking in Java》里面是这样说的,“composing a new class from existing classes, this concept is called composition (if the composition happens dynamically, it's usually called aggregation)”。

意思是通过现在的类组合成一个新的类,叫做组合,如果这种组合是动态的,则叫聚合。如何理解”动态“,也就是可以随时加进来也可以随时删除,拿上面的人与电脑的例子来说,电脑可以随时扔掉,也可以随时加进来,人的生命不会受到威胁,但是人如果少了某个器官,则会危及到生命了!其实现实中的例子与Java中的概念还是有一点出入,类比只能是接近真相。



组合和聚合是有很大区别的,这个区别不是在形式上,而是在本质上: 比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象也同时消亡(没有任何一个引用指向它,成了垃圾对象),这种情况叫做组合,反之b所指向的对象还会有另外的引用指向它,这种情况叫聚合。 在实际写代码时组合方式一般会这样写: A类的构造方法里创建B类的对象,也就是说,当A类的一个对象产生时,B类的对象随之产生,当A类的这个对象消亡时,它所包含的B类的对象也随之消亡。 聚合方式则是这样: A类的对象在创建时不会立即创建B类的对象,而是等待一个外界的对象传给它 传给它的这个对象不是A类创建的。 现实生活中: 人和手,脚是组合关系,因为当人死亡后人的手也就不复存在了。人和他的电脑是聚合关系。
class Hand{  
}  
class Computer{  
}  
//组合:  
class Person{  
  private Hand hand;  
  public Person(){  
  hand = new Hand(); 
 }  
}  
//聚合:  
class Person{  
  private Computer computer;  
  public setComputer(){  
  computer = new Computer();  
 }  
} 
转自:https://www.cnblogs.com/TaoLeonis/p/7126340.html

posted on 2019-11-12 15:49  Hinwya  阅读(89)  评论(0编辑  收藏  举报

导航