Java中聚合和组合的实现差异

时间:2012-08-09 10:38:33

标签: java relationship aggregation composition

我知道聚合和组合之间的概念差异。有人可以通过示例告诉我它们之间Java的实现差异吗?

9 个答案:

答案 0 :(得分:206)

组合物

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();
  }
}

在组合的情况下,发动机完全由汽车封装。外界无法获得对引擎的引用。发动机与汽车一起生存和死亡。通过聚合,Car还可以通过引擎执行其功能,但引擎并不总是Car的内部部分。发动机可以互换,甚至完全拆除。不仅如此,外界还可以引用引擎,无论是否在车内,都可以对其进行修补。

答案 1 :(得分:19)

我会使用一个很好的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);
     }
}

围绕这个。

答案 2 :(得分:3)

区别在于任何组合都是聚合,反之亦然。

让我们设定条款。 Aggregation是UML标准中的元项,意味着BOTH组合和共享聚合,简称为 shared 。它经常被错误地命名为“聚合”。它是坏的,因为组合也是聚合。据我了解,您的意思是“共享”。

进一步来自UML标准:

  

composite - 表示属性是复合聚合的,   即复合对象对存在和存在负责   存储组合对象(部分)。

所以,大学到cathedras协会是一个组合,因为大学(IMHO)不存在大教堂

  

共享聚合的精确语义因应用领域而异   建模器。

即,如果您只遵循您或其他人的某些原则,则可以将所有其他关联绘制为共享聚合。另请查看here

答案 3 :(得分:3)

简单来说:

组合和聚合都是关联。 组合物 - &gt;强有力的关系 聚合 - &gt;弱有关系。

答案 4 :(得分:3)

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

enter image description here

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

请检查!!!

答案 5 :(得分:2)

一个简单的作文程序

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);

    }
}

答案 6 :(得分:1)

首先,我们必须讨论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;

    }
}

对于Composition,必须始终使用其关联对象的标识创建从属对象。您可以使用内部类。

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案例可能会成为组合,并且必须注册组织。同样,如果您维护汽车零件的库存,则车轮关系可以是聚合。

答案 7 :(得分:1)

聚合与构成

聚集表示子级可以独立于父级存在的关系。例如,“银行和雇员”,删除“银行”和“雇员”仍然存在。

组成表示子代不存在而与父代无关的关系。例子:人与心,心并不与人分开存在。

聚集关系为“具有” ,而组成关系为“部分”关系。

组成是一个强关联,而聚合是一个弱关联。

答案 8 :(得分:0)

这两种类型当然都是关联,并没有真正严格地映射到这样的语言元素。不同之处在于目的,背景以及系统的建模方式。

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

  • 汽车注册系统主要跟踪汽车及其车主等。这里我们对引擎作为一个单独的实体不感兴趣,但我们可能仍然有引擎相关属性,如动力和燃料类型。这里的引擎可能是汽车实体的复合部分。

  • 汽车服务车间管理系统,负责管理汽车零件,维修汽车和更换零件,可能是完整的发动机。在这里,我们甚至可以放置发动机,并且需要分别跟踪它们和其他部件并且独立于汽车。这里引擎可能是汽车实体的聚合部分。

如何用您的语言实现这一点是一个小问题,因为在那个级别,可读性等问题更为重要。