Есть два типа связи между объектами: АССОЦИАЦИЯ, которая делится на композицию и агрегацию, и НАСЛЕДОВАНИЕ.
Ассоциация (делится на композицию и агрегацию) - это связь между двумя классами, которая позволяет одному классу использовать функциональность другого класса.
Ассоциация - обозначает связь между объектами. Например, игрок играет в определенной команде. Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом.
Например Менеджер может выписать Счет. Соответственно возникает ассоциация между Менеджером и Счетом. Еще пример — Преподаватель и Студент — т.е. какой-то Студент учится у какого-то Преподавателя.
Ассоциация и есть описание связи между двумя объектами. Студент учится у Преподавателя. Идея достаточно простая — два объекта могут быть связаны между собой и это надо как-то описать.
Например, класс 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 » подразумевает ассоциацию (агрегацию или композицию).