Разница в реализации между Агрегацией и Композицией в 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 профессоров. Между Университетом и его отделениями существует композиционная связь. Существует агрегационная связь между кафедрой и ее профессорами.
Композиция - это просто СИЛЬНОЕ объединение, если университет разрушен, то и кафедры должны быть уничтожены. Но мы не должны убивать профессоров, даже если исчезают их соответствующие отделы.
В яве:
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);
}
}
Что-то вокруг этого.
Сначала надо поговорить о том, какая на самом деле разница между 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();
}
}
Обратите внимание, что один и тот же вариант использования может подпадать под агрегацию / составление в зависимости от сценария применения. Например, дело "Человек-организация" может стать составным, если вы разрабатываете приложение для людей, работающих в какой-либо организации, и ссылка на организацию обязательна для регистрации. Точно так же, если вы ведете инвентаризацию для частей Автомобиля, отношения Колесо-Колесо могут быть агрегацией.
Проще говоря:
И Состав, и Объединение являются Ассоциациями. Композиция -> Сильные отношения Has-A Агрегация -> Слабые отношения Has-A.
Простая Композиционная программа
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);
}
}
В приведенном ниже URL есть отличное объяснение.
http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit
Пожалуйста, проверьте!!!
Агрегация против композиции
Агрегация подразумевает отношения, при которых ребенок может существовать независимо от родителя. Например, Банк и Сотрудник, удалите Банк, и Сотрудник все еще существует.
тогда как композиция подразумевает отношения, при которых ребенок не может существовать независимо от родителя. Пример: Человек и сердце, сердце не существуют отдельно от Человека.
Отношение агрегации - это отношение "имеет", а композиция - отношение "часть из".
Состав - это сильная ассоциация, тогда как агрегирование - это слабая ассоциация.
Разница в том, что любая композиция является агрегацией, а не наоборот.
Давайте установим условия. Агрегация является мета-термином в стандарте UML и означает ОБА композицию и общую агрегацию, просто называемую общей. Слишком часто это называется неправильно "агрегация". Это ПЛОХО, потому что композиция - это тоже совокупность. Как я понимаю, вы имеете в виду "поделился".
Далее из стандарта UML:
составной - указывает, что свойство агрегировано составным образом, т. е. составной объект несет ответственность за существование и хранение составных объектов (частей).
Таким образом, ассоциация университета с кафедрами - это композиция, потому что кафедры не существует вне университета (ИМХО).
Точная семантика совместной агрегации зависит от области применения и модели.
То есть все другие ассоциации могут быть нарисованы как общие объединения, если вы только следуете некоторым своим или чужим принципам. Также посмотрите здесь.
Оба типа, конечно, являются ассоциациями, и на самом деле они не отображаются строго на такие элементы языка. Разница заключается в цели, контексте и способах моделирования системы.
В качестве практического примера, сравните два разных типа систем с похожими объектами:
Система регистрации автомобилей, которая в первую очередь отслеживает автомобили, их владельцев и т. Д. Здесь нас не интересует двигатель как отдельная сущность, но у нас все же могут быть атрибуты, связанные с двигателем, такие как мощность и тип топлива. Здесь Двигатель может быть составной частью автомобильного объекта.
Система управления автосервисом, которая управляет автомобильными деталями, обслуживает автомобили и заменяет детали, возможно, комплектные двигатели Здесь у нас даже могут быть запасные двигатели, и мы должны отслеживать их и другие детали отдельно и независимо от автомобилей. Здесь Двигатель может быть агрегированной частью автомобильного объекта.
Как вы реализуете это на своем языке, не имеет большого значения, так как на этом уровне такие вещи, как читабельность, гораздо важнее.