Разница в реализации между агрегацией и композицией в Java

Я знаю о концептуальных различиях между агрегацией и составом. Может ли кто-нибудь сказать мне разницу в реализации Java между ними с примерами?

8 ответов


состав

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

в случае состава, двигатель вполне помещен автомобилем. Для внешнего мира нет способа получить ссылку на двигатель. Двигатель живет и умирает вместе с машиной. При агрегации автомобиль также выполняет свои функции через двигатель, но двигатель не всегда является внутренней частью автомобиля. Двигатели могут быть заменены, или даже полностью удалены. Не только это, но и внешний мир могу еще ссылку на двигатель, и возиться с ним, независимо от того в машине.


Я бы использовал хороший пример 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);
     }
}

что-то около этого.


простая программа состав

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 и означает как композицию, так и общую агрегацию с простым именем shared. Слишком часто его неправильно называют "агрегацией". Это плохо, потому что композиция-тоже агрегация. Как я понимаю, вы имеете в виду "общий".

далее от стандарта UML:

composite-указывает, что имущество объединяется композиционно, т. е. составной объект несет ответственность за существование и хранение составленных объектов (частей).

Итак, объединение университета с соборами-это композиция, потому что cathedra не существует вне университета (IMHO)

точная семантика общей агрегации зависит от области применения и модельер.

т. е., все остальные ассоциации можно нарисовать как общие агрегации, если вы только следуете каким-то своим принципам или принципам кого-то другого. Также посмотрите здесь.


простыми словами :

композиции и агрегации объединений. Состав - > сильный имеет-отношение Агрегация - > слабая имеет-связь.


в приведенном ниже url-адресе есть отличное объяснение.

enter image description here

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

пожалуйста, проверьте!!!


Сначала мы должны поговорить о том, что на самом деле разница между Aggregation и Composition должен быть на той же странице.

агрегация-это ассоциация, в которой связанная сущность может существовать независимо от ассоциации. Например, человек может быть связан с организацией, но он / она может иметь независимое существование в системе.

, тогда как

композиция относится к ситуации, когда один из связанных объектов сильно связан с другим и не может существовать без существования другого. Фактически идентичность этой сущности всегда связана с идентичностью другого объекта. Например, колеса в автомобиле.

теперь агрегация может быть просто достигнута путем удержания свойства одного объекта в другом, как показано ниже:

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;

    }
}

для композиции необходимо, чтобы зависимый объект всегда создавался с идентификацией связанного с ним объекта. Вы можете использовать внутренний класс для того же.

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

обратите внимание, что один и тот же вариант использования может подпадать под агрегацию/состав в зависимости от сценария приложения. Например, дело человек-организация может стать композицией, если вы разрабатываете приложение для людей, работающих в какой-либо организации, и ссылка на организацию должна быть для регистрации. Аналогично, если вы ведете инвентаризацию для частей автомобиля, отношение автомобиль-колесо может быть агрегацией.


оба типа, конечно, ассоциации, и на самом деле не сопоставлены строго с языковыми элементами, как это. Разница заключается в цели, контексте и том, как моделируется система.

в качестве практического примера сравните два разных типа систем с аналогичными сущностями:

  • система регистрации автомобилей, что в первую очередь отслеживать автомобили, и их владельцы и т. д. Здесь мы не заинтересованы в двигателе как отдельной сущности, но мы можем все еще имеют атрибуты, связанные с двигателем, такие как мощность и тип топлива. Здесь двигатель может быть композитные часть объекта автомобиля.

  • система управления автомастерской который управляет частями автомобиля, обслуживая автомобили, и заменяет части, возможно полные двигатели. Здесь у нас даже могут быть двигатели, и нам нужно отслеживать их и другие части отдельно и независимо от автомобилей. Здесь двигатель может быть агрегированные часть о сущности автомобиля.

Как вы реализуете это на своем языке, вызывает незначительную озабоченность, поскольку на этом уровне такие вещи, как читаемость, намного важнее.