Java中Aggregation和Composition之间的实现差异

我意识到聚合与合成之间的概念差异。 有人可以告诉我他们之间的Java实现差异与例子吗?

组成

final class Car { private final Engine engine; Car(EngineSpecs specs) { engine = new Engine(specs); } void move() { engine.work(); } } 

聚合

 final class Car { private Engine engine; void setEngine(Engine engine) { this.engine = engine; } void move() { if (engine != null) engine.work(); } } 

在构成的情况下,发动机完全被汽车封装。 外部世界无法获得引擎的引用。 发动机和汽车一起死亡。 通过聚合,汽车也通过发动机执行其function,但是发动机并不总是汽车的内部部分。 发动机可能会被换掉,甚至完全被移除。 不仅如此,外部世界仍然可以参考引擎,不pipe它是否在汽车里。

我会用一个很好的UML例子。

采取大学有1至20个不同的部门,每个部门有1至5个教授。 大学与其部门之间有一个构成联系。 部门和教授之间有一个聚合链接。

构成只是一个强大的聚合,如果大学被摧毁,那么部门也应该被销毁。 但即使各部门消失,我们也不应该杀了教授。

在java中:

 public class University { private List<Department> departments; public void destroy(){ //it's composition, when i destroy a university I also destroy the departments. they cant live outside my university instance if(departments!=null) for(Department d : departments) d.destroy(); departments.clean(); departments = null; } } public class Department { private List<Professor> professors; private University university; Department(University univ){ this.university = univ; //check here univ not null throw whatever depending on your needs } public void destroy(){ //It's aggregation here, we just tell the professor they are fired but they can still keep living for(Professor p:professors) p.fire(this); professors.clean(); professors = null; } } public class Professor { private String name; private List<Department> attachedDepartments; public void destroy(){ } public void fire(Department d){ attachedDepartments.remove(d); } } 

在这附近的东西。

简单来说 :

组合和聚合都是关联。 组合 – >强有一个关系聚合 – >弱有一个关系。

下面给出的URL有一个很好的解释。

在这里输入图像描述

http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit

请检查!!!

一个简单的合成程序

 public class Person { private double salary; private String name; private Birthday bday; public Person(int y,int m,int d,String name){ bday=new Birthday(y, m, d); this.name=name; } public double getSalary() { return salary; } public String getName() { return name; } public Birthday getBday() { return bday; } ///////////////////////////////inner class/////////////////////// private class Birthday{ int year,month,day; public Birthday(int y,int m,int d){ year=y; month=m; day=d; } public String toString(){ return String.format("%s-%s-%s", year,month,day); } } ////////////////////////////////////////////////////////////////// } public class CompositionTst { public static void main(String[] args) { // TODO code application logic here Person person=new Person(2001, 11, 29, "Thilina"); System.out.println("Name : "+person.getName()); System.out.println("Birthday : "+person.getBday()); //The below object cannot be created. A bithday cannot exixts without a Person //Birthday bday=new Birthday(1988,11,10); } } 

不同之处在于,任何构图都是聚合,而不是相反。

让我们来设置条款。 聚合是UML标准中的一个元语言,意味着两者的组合和共享聚合,简称为共享 。 通常它被错误地命名为“聚合”。 这是坏的,因为构图也是一个聚合。 据我所知,你的意思是“共享”。

进一步从UML标准:

复合 – 指示属性是合成的,即复合对象负责组合对象(零件)的存在和存储。

所以,大学教会协会是一个组成部分,因为大学不存在大教堂(恕我直言)

共享聚合的精确语义因应用领域和build模者而异。

也就是说,如果你只遵循你的或其他人的一些原则,所有其他的协会都可以被看作共享的聚合。 也看这里 。

首先,我们必须谈论实际上AggregationComposition之间的区别是在同一个页面上。

聚集是关联实体可以独立于关联而存在的关联。 例如,一个人可能与一个组织有联系,但他/她在该系统中可能有独立的存在。

构成是指当一个关联实体与另一个关联实体强相关并且在没有另一个存在时不能存在的情况。 事实上,该实体的身份总是与另一个对象的身份相关联。 例如,在一辆车的车轮。

现在,可以简单地通过将一个实体的财产保存在另一个实体中来实现聚合,如下所示:

 class Person { Organisation worksFor; } class Organisation { String name; } class Main { public static void main(String args[]) { //Create Person object independently Person p = new Person(); //Create the Organisation independently Organisation o = new Organisation(); o.name = "XYZ Corporation"; /* At this point both person and organisation exist without any association */ p.worksFor = o; } } 

对于组合,必须始终使用其关联对象的标识创build依赖对象。 你可以使用相同的内部类。

 class Car { class Wheel { Car associatedWith; } } class Main { public static void main() { //Create Car object independently Car car = new Car(); //Cannot create Wheel instance independently //need a reference of a Car for the same. Car.Wheel wheel = car.new Wheel(); } } 

请注意,根据应用场景,相同的用例可能属于聚合/组合。 例如,如果您正在为在某个组织中工作的人员开发应用程序,那么Person-Organization案例可能会成为组合,并且组织的引用必须注册。 同样,如果您维护汽车零件的库存,车轮关系可以是聚合。

这两种types当然是联系,并没有真正地映射到这样的语言元素。 区别在于目的,上下文以及系统是如何build模的。

作为一个实际的例子,比较具有相似实体的两种不同types的系统:

  • 一个主要跟踪汽车及其所有者的汽车注册系统 。在这里我们不关心发动机作为一个单独的实体,但我们可能仍然有发动机相关的属性,如功率和燃料types。 这里发动机可能是汽车实体的组成部分。

  • pipe理汽车零件,维修汽车和更换零件的汽车服务店pipe理系统 ,可能是完整的发动机。 在这里,我们甚至可能有引擎库存,需要跟踪他们和其他部分分开和独立的汽车。 在这里,引擎可以是汽车实体的聚合部分。

你如何用你的语言来实现这一点是很不重要的,因为在这个层面上,可读性是非常重要的。