Найти тему
JavAKnazzz

Java. Ассоциация, композиция и агрегация

Оглавление

Есть два типа связи между объектами: АССОЦИАЦИЯ, которая делится на композицию и агрегацию, и НАСЛЕДОВАНИЕ.

Ассоциация (делится на композицию и агрегацию) - это связь между двумя классами, которая позволяет одному классу использовать функциональность другого класса.

Ассоциация - обозначает связь между объектами. Например, игрок играет в определенной команде. Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом.
Например Менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще пример — Преподаватель и Студент — т.е. какой-то Студент учится у какого-то Преподавателя.
Ассоциация и есть описание связи между двумя объектами. Студент учится у Преподавателя.
Идея достаточно простая — два объекта могут быть связаны между собой и это надо как-то описать.

Например, класс Car может иметь ассоциацию с классом Engine, чтобы использовать его функциональность для движения.



Пример:

public class Car {
    private Engine engine;

    public Car(Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.start();
    }
}

public class Engine {
    public void start() {
        // some code to start the engine
    }
}

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

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

Композиция — еще более «жесткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то.
Например Машина и Двигатель. Хотя двигатель может быть и без машины, но он вряд ли сможет быть в двух или трех машинах одновременно. В отличии от студента, который может входить и в другие группы тоже.
Например, в класс автомобиля содержит объект класса электрического двигателя:
При этом класс автомобиля полностью управляет жизненным циклом объекта двигателя. При уничтожении объекта автомобиля в области памяти вместе с ним будет уничтожен и объект двигателя. И в этом плане объект автомобиля является главным, а объект двигателя - зависимой.

Например, класс Car может иметь композицию с классом Wheel, так как машина не может существовать без колес.

Пример:

public class Car {
    private Wheel[] wheels;

    public Car() {
        wheels = new Wheel[4];
        for (int i = 0; i < 4; i++) {
            wheels[i] = new Wheel();
        }
    }
}

public class Wheel {
    // some code for the wheel
}

В этом примере класс Car имеет композицию с классом Wheel, так как машина не может существовать без колес.

Агрегация - это связь между двумя классами, где один класс может содержать другой класс, но он может существовать и без него.

Агрегация является особой формой ассоциации. Это более конкретизированные отношения между объектами.
Агрегация — отношение когда один объект является частью другого.
Например: Студент входит в Группу любителей физики.Это представляет отношения HAS-A.
Агрегация определяет отношение HAS A ("имеет"), но связь слабее, чем в композиции, т.к. обьекты будут равноправны.

Например, класс University может иметь агрегацию с классом Student, так как университет может существовать без студентов.

Пример:

public class University {
    private List<Student> students;

    public University() {
        students = new ArrayList<>();
    }

    public void addStudent(Student student) {
        students.add(student);
    }
}

public class Student {
    // some code for the student
}

В этом примере класс University имеет агрегацию с классом Student, так как университет может существовать без студентов.

В чем разница между композицией и агрегацией?


Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».

Агрегация предполагает, что объекты связаны взаимоотношением
«part-of» (часть). Композиция более строгий вариант агрегации.
Дополнительно к требованию
«part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.

Что подразумевают в плане принципов ООП выражения «является» и «имеет»?


«является IS A » подразумевает наследование.
«имеет HAS A » подразумевает ассоциацию (агрегацию или композицию).