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

В приложении мы создаем различные классы и проектируем их взаимодействия. Эти классы могут быть или не быть связаны с другими для имитации реальных сущностей.

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

Ассоциация, агрегация и композиция отношений

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. Заключение

Иногда принятие решения о том, является ли отношение ассоциацией, агрегацией или композицией, может быть сложным процессом. Эта трудность отчасти вызвана тем, что агрегация и композиция являются подмножествами ассоциации, то есть они являются частными случаями ассоциации.

Но, уделив немного внимания этому уроку и усвоив уроки, мы можем легко определить различия между этими отношениями.

Пишите мне свои вопросы в комментариях.

Прокрутить вверх