Мені відомі концептуальні відмінності між агрегацією та складом. Чи може хтось сказати мені різницю реалізації в Java між ними з прикладами?
Мені відомі концептуальні відмінності між агрегацією та складом. Чи може хтось сказати мені різницю реалізації в 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();
}
}
Що стосується складу, Двигун повністю інкапсульований Автомобілем. У зовнішньому світі немає можливості отримати посилання на Двигун. Двигун живе і гине з машиною. При агрегації Автомобіль також виконує свої функції через Двигун, але Двигун не завжди є внутрішньою частиною Автомобіля. Двигуни можуть бути замінені або навіть повністю зняті. Мало того, але зовнішній світ все ще може мати посилання на Двигун, і повозитися з ним незалежно від того, чи є він у Автомобілі.
new Engine(EngineSpecs)
виклику, навіть якщо не було машини. Спосіб досягнення композиції полягає у створенні двигуна як внутрішнього класу, щоб об'єкт двигуна завжди створювався з посиланням на автомобільний об’єкт
Я б використав приємний приклад 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
Будь ласка, перевірте!!!
Давайте встановимо умови. Агрегація є метатермою у стандарті UML і означає BOTH композицію та спільну агрегацію, яку просто називають спільною . Занадто часто його неправильно називають "агрегацією". Це БАД, для композиції теж є агрегація. Як я розумію, ви маєте на увазі "поділився".
Далі від стандарту UML:
композитний - вказує на те, що властивість об'єднана складно, тобто складений об'єкт несе відповідальність за існування та зберігання складених об'єктів (частин).
Отже, асоціація "Університет з Кафедрами" - це склад, оскільки кафедра не існує поза університетом (ІМХО)
Точна семантика спільної агрегації змінюється залежно від області застосування та моделера.
Тобто всі інші асоціації можна скласти як спільні агрегації, якщо ви дотримуєтесь лише певних ваших принципів чи когось іншого. Також дивіться тут .
Проста композиційна програма
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);
}
}
По-перше, ми повинні поговорити про те, що насправді є різницею між собою 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();
}
}
Зауважте, що той самий випадок використання може підпадати під агрегацію / склад залежно від сценарію застосування. Наприклад, випадок "Організація з особами" може стати складовим, якщо ви розробляєте заявку для людей, які працюють у якійсь організації, і для реєстрації потрібно посилатися на організацію. Аналогічно, якщо ви ведете інвентар для частин автомобіля, відношення автомобіля-колеса може бути агрегацією.
Агрегація проти складу
Агрегація передбачає відносини, коли дитина може існувати незалежно від батька. Наприклад, Банк та працівник, видаліть Банк, а працівник все ще існує.
тоді як склад має на увазі відносини, коли дитина не може існувати незалежно від батьків. Приклад: Людина і серце, серце не існують окремо для людини.
Співвідношення агрегації є "має-має", а склад - "частка".
Склад є сильною асоціацією, тоді як Агрегація є слабкою асоціацією.
Обидва типи, звичайно, асоціації, і насправді не чітко відображені на таких мовних елементах. Різниця полягає у призначенні, контексті та способі моделювання системи.
Як практичний приклад, порівняйте два різних типи систем з подібними об'єктами:
Система реєстрації автомобілів, яка в першу чергу відстежує автомобілі та їх власників тощо. Тут нас не цікавить двигун як окрема сутність, але ми все ще можемо мати такі атрибути, що стосуються двигуна, як потужність та тип палива. Тут Двигун може бути складовою частиною автомобільної сутності.
Система управління автосервісом, яка керує автозапчастинами, обслуговує машини та замінює деталі, можливо комплектуючі двигуни. У нас, можливо, навіть є запасні двигуни і нам потрібно відстежувати їх та інші частини окремо та незалежно від автомобілів. Тут Двигун може бути складеною частиною автомобіля.
Те, як ви реалізуєте це на своїй мові, викликає незначне значення, оскільки на цьому рівні такі речі, як читабельність, є набагато важливішими.