В приложении мы создаем различные классы и проектируем их взаимодействия. Эти классы могут быть или не быть связаны с другими для имитации реальных сущностей.
Ассоциация, агрегация и композиция — три типа отношений, которые могут быть у классов в объектно-ориентированном программировании. Из данного изображения ясно, что агрегация и композиции также являются специфическими типами ассоциации.

1. Ассоциация
Ассоциация — наиболее мягкая связь. Ассоциация относится к связям, в которых объекты-участники имеют независимые жизненные циклы и между объектами нет владения.
Давайте рассмотрим пример Учителя и Ученика. Один ученик может быть связан с несколькими учителями, а один учитель может обучать нескольких учеников, но у обоих есть свои жизненные циклы(оба могут создаваться и удаляться независимо).
Например, когда учитель покидает школу, нам не нужно удалять ни одного ученика, а когда ученик покидает школу, нам не нужно удалять ни одного учителя.

В следующем коде классы Teacher и Student ссылаются друг на друга, но они независимы. Оба класса могут быть изменены без влияния на другой класс.
class Teacher {List<Student> students;public void teach(){}}class Student {List<Teacher> teachers;public void learn(){}}
Обратите внимание, что ассоциация может быть одного из следующих типов:
- один на один
- один-ко-многим
- многие-к-одному
- многие-ко-многим
Обсуждаемый пример Студента и Учителя
2. Агрегация
Агрегация — это немного ограничительный тип ассоциации. Она относится к связи между двумя классами, при которой объекты обоих классов могут иметь независимый жизненный цикл, но объект одного класса будет принадлежать определенному объекту другого класса в течение его жизненного цикла. Он не может принадлежать двум объектам одного и того же класса.
Чтобы понять терминологию реального мира, давайте возьмем пример сотового телефона и батареи. Батарея может быть связана с любым телефоном, но как только связь установлена, мы не можем использовать батарею в двух сотовых телефонах одновременно. Сотовый телефон владеет батареей, когда она используется.
С технической точки зрения, когда мы удаляем телефон из базы данных, объект аккумулятора телефона не будет удален, поскольку он все еще может быть функциональным и может быть использован в другом телефоне. Таким образом, в агрегации, пока есть владение, объекты имеют свой собственный жизненный цикл.

В следующем коде CellPhone ссылается на экземпляр класса CellBattery. Тот же экземпляр CellBattery не может использоваться с другими экземплярами CellPhone. В идеале, чтобы получить экземпляр CellBattery, мы должны получить к нему доступ только через экземпляр CellPhone.
class CellPhone {CellBattery battery;public void ring(){}}class CellBattery {short remainingEnergy;public void charge(){}}
Чтобы узнать процент заряда батареи, нам сначала нужно получить доступ к экземпляру CellPhone.
short remainingEnergy = phone.getBattery().getRemainingEnergy();
3. Состав
Композиция — это более строгая связь между двумя классами. Она относится к связям, в которых два объекта не имеют независимого жизненного цикла, и если родительский объект удаляется, все дочерние объекты также будут удалены.
Давайте рассмотрим пример взаимосвязи между вопросами и ответами. Вопрос с множественным выбором может иметь несколько ответов. Но ответ не может принадлежать нескольким вопросам. Если мы удалим вопрос, его ответы будут автоматически удалены.
class Question {int id;String text;List<Answer> answers;}class Answer {long id;String text;boolean correct;}
4. Заключение
Иногда принятие решения о том, является ли отношение ассоциацией, агрегацией или композицией, может быть сложным процессом. Эта трудность отчасти вызвана тем, что агрегация и композиция являются подмножествами ассоциации, то есть они являются частными случаями ассоциации.
Но, уделив немного внимания этому уроку и усвоив уроки, мы можем легко определить различия между этими отношениями.
Пишите мне свои вопросы в комментариях.