Объяснение ассоциации, агрегирования и композиции в ООП

Унифицированный язык моделирования (UML) де-факто является стандартом для моделирования объектно-ориентированных систем. В UML существует пять различных типов отношений: ассоциация, агрегирование, композиция, зависимость и наследование. В этой статье мы обсудим первые три из этих концепций, оставив остальные в отдельном сообщении в блоге.

Ассоциация в объектно-ориентированном программировании

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

В качестве примера представьте себе отношения между врачом и пациентом. Врач может быть связан с несколькими пациентами. Одновременно один пациент может посещать несколько врачей для лечения или консультации. У каждого из этих объектов свой жизненный цикл, и у них нет «владельца» или родителя. Объекты, которые являются частью отношения ассоциации, могут быть созданы и уничтожены независимо.

В UML отношения ассоциации представлены одной стрелкой. Связь ассоциации может быть представлена ​​как один к одному, один ко многим или многие ко многим (также известное как количество элементов). По сути, ассоциативная связь между двумя или более объектами обозначает путь связи (также называемый связью) между ними, так что один объект может отправлять сообщение другому. В следующем фрагменте кода показано, как два класса, BlogAccount и BlogEntry, связаны друг с другом.

открытый класс BlogAccount

   {

       частный BlogEntry [] blogEntries;

       // Другие члены класса BlogAccount

   }

открытый класс BlogEntry

   {

       Int32 blogId;

       заголовок строки;

       текст строки;

       // Другие члены класса BlogEntry

   }

Агрегация в объектно-ориентированном программировании

Агрегация - это специализированная форма ассоциации между двумя или более объектами, в которой каждый объект имеет свой собственный жизненный цикл, но также существует право собственности. Агрегация - это типичные отношения целое / часть или родитель / потомок, но это может означать, а может и не обозначать физическое сдерживание. Существенным свойством отношения агрегирования является то, что целое или родительский (т. Е. Владелец) может существовать без части или дочернего элемента, и наоборот.  

Например, сотрудник может принадлежать к одному или нескольким отделам организации. Однако, если отдел сотрудника будет удален, объект сотрудника не будет уничтожен, но останется в живых. Обратите внимание, что отношения между объектами, участвующими в агрегации, не могут быть взаимными, т. Е. Отдел может «владеть» служащим, но сотрудник не владеет отделом. В следующем примере кода очевидна связь агрегирования между классами BlogAuthor и BlogAccount.

открытый класс BlogAuthor

   {

       частный Int32 authorId;

       частная строка firstName;

       частная строка lastName;

       // Другие члены класса BlogAuthor

   }

открытый класс BlogAccount

   {

       частный BlogEntry [] blogEntries;

       // Другие члены класса BlogAccount

   }

Агрегация обычно представлена ​​в UML линией с полым ромбом. Как и ассоциация, агрегирование может включать отношения «один к одному», «один ко многим» или «многие ко многим» между участвующими объектами. В случае отношения «один ко многим» или «многие ко многим» мы можем сказать, что это избыточное отношение.

Композиция в объектно-ориентированном программировании

Состав - это специализированная форма агрегирования. В композиции, если родительский объект уничтожен, дочерние объекты также перестают существовать. Композиция на самом деле является сильным типом агрегирования и иногда упоминается как «смертельные» отношения. Например, дом может состоять из одной или нескольких комнат. Если дом разрушен, то все комнаты, являющиеся его частью, также разрушаются. Следующий фрагмент кода иллюстрирует композиционные отношения между двумя классами, House и Room.

общественный дом

{

   отдельная комната;

   трактир()

   {

       room = новая комната ();

   }

}

Подобно агрегации, композиция также является отношением целое / часть или родитель / потомок. Однако в композиции жизненный цикл детали или дочернего элемента контролируется целым или родительским элементом, которому он принадлежит. Следует отметить, что это управление может быть как прямым, так и транзитивным. То есть родитель может нести прямую ответственность за создание или уничтожение дочернего элемента, или родитель может использовать дочерний элемент, который уже был создан. Точно так же родительский объект может делегировать управление другому родительскому объекту для уничтожения дочернего объекта. Композиция представлена ​​в UML с помощью линии, соединяющей объекты со сплошным ромбиком на конце объекта, которому принадлежит другой объект.

Я надеюсь, что это обсуждение отношений ассоциации, агрегирования и композиции помогло вам понять, чем отличаются эти три концепции. Помните, что агрегирование и композиция - это подмножества ассоциации. Как при агрегировании, так и в композиции объект одного класса может быть владельцем объекта другого класса. И при агрегации, и при композиции дочерние объекты принадлежат единственному родительскому объекту, т. Е. У них может быть только один владелец.

Наконец, в отношении агрегирования жизненные циклы родительских и дочерних объектов независимы. В композиционных отношениях смерть родительского объекта также означает смерть его дочерних объектов.