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 ниже.
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(); } }обратите внимание, что один и тот же вариант использования может подпадать под агрегацию/композицию в зависимости от сценария приложения. Например, случай человек-организация может стать композицией, если вы разрабатываете приложение для людей, работающих в какой-либо организации, и ссылка на организацию должна быть зарегистрирована. Аналогично, если вы ведете инвентаризацию для частей автомобиля, отношение автомобиль-колесо может быть агрегацией.
оба типа, конечно, ассоциации, и на самом деле не отображаются строго на элементы языка, как это. Разница заключается в цели, контексте и способе моделирования системы.
в качестве практического примера сравните два разных типа систем с аналогичными сущностями:
система регистрации автомобилей, что в первую очередь отслеживать автомобили, и их владельцы и т. д. Здесь нас не интересует движок как отдельная сущность, но мы можем все еще есть связанные с двигателем атрибуты, такие как мощность и тип топлива. Здесь двигатель может быть композитные часть объекта автомобиля.
система управления автосервисом который управляет автомобильными деталями, обслуживает автомобили и заменяет детали, возможно, полные двигатели. Здесь мы можем даже иметь двигатели, снабженные и должны отслеживать их и другие части отдельно и независимо от автомобилей. Здесь двигатель может быть агрегированные часть о сущности автомобиля.
то, как вы реализуете это на своем языке, вызывает незначительную озабоченность, поскольку на этом уровне такие вещи, как читаемость, гораздо важнее.

Comments