Важно понимать, почему мы должны беспокоиться об использовании более одного раза линии отношений. Наиболее очевидная причина заключается в описании отношений родитель-потомок между классами (когда родитель удалял все дочерние элементы удаляются в результате), но, что более важно, мы хотим различать простую ассоциацию и композицию, чтобы наложить неявные ограничения на видимость и распространение изменений в связанных классах, вопрос, который играет важную роль в понимании и уменьшении сложности системы.
Ассоциация
Наиболее абстрактным способом описания статических отношений между классами является использование ссылки на ассоциацию, которая просто утверждает, что существует какая-то связь или зависимость между двумя классами или более.
Слабая ассоциация
ClassA может быть связан с ClassB, чтобы показать, что один из его методов включает параметр экземпляра ClassB или возвращает экземпляр ClassB.
Сильная Ассоциация
ClassA также может быть связан с ClassB, чтобы показать, что он содержит ссылку на экземпляр ClassB.
Агрегация (общая ассоциация)
В тех случаях, когда между ClassA (целым) и ClassB (частичным) существует частичная взаимосвязь, мы можем быть более конкретными и использовать ссылку агрегации вместо ссылки ассоциации, подчеркивая, что ClassB также может агрегироваться другими классами в приложение (следовательно, агрегация также называется общей ассоциацией).
Важно отметить, что ссылка агрегации никоим образом не указывает, что ClassA владеет ClassB, или что между ними есть отношения родитель-потомок (когда родитель удалял все его дочерние элементы удаляются). На самом деле, совсем наоборот! Ссылка агрегации обычно используется, чтобы подчеркнуть тот факт, что ClassA не является эксклюзивным контейнером ClassB, поскольку на самом деле ClassB имеет другой контейнер.
Агрегация против. Ассоциация
Ссылка на ассоциацию может заменить ссылку агрегации в любой ситуации, в то время как агрегация не может заменить ассоциацию в ситуациях, когда существует только «слабая связь» между классами, то есть ClassA имеет метод (ы), которые содержат параметр ClassB, но ClassA не содержит ссылку на Экземпляр класса B.
Мартин Фаулер предлагает, чтобы ссылка агрегации вообще не использовалась, потому что она не имеет добавленной стоимости и нарушает согласованность, цитируя Джима Рамбо «Думайте об этом как о плацебо моделирования».
Композиция (Неразделенная ассоциация)
Мы должны быть более конкретными и использовать композиционную ссылку в тех случаях, когда в дополнение к частичной взаимосвязи между ClassA и ClassB - существует сильная зависимость жизненного цикла между ними, что означает, что когда ClassA удаляется, ClassB также удаляется как результат
Составная ссылка показывает, что класс (контейнер, целое) обладает исключительным владением другим классом (частями), что означает, что объект контейнера и его части составляют отношения родитель-потомок / с.
В отличие от ассоциации и агрегации, при использовании составного отношения составной класс не может отображаться как тип возвращаемого значения или тип параметра составного класса. Таким образом, изменения в составленном классе не могут распространяться на остальную часть системы. Следовательно, использование композиции ограничивает рост сложности по мере роста системы.
Измерительная система сложности
Системный комплекситy можно измерить, просто взглянув на диаграмму классов UML и оценив линии связи, агрегации и композиции. Способ измерения сложности состоит в определении количества классов, на которые может повлиять изменение определенного класса. Если класс A предоставляет класс B, то на любой данный класс, который использует класс A, теоретически могут повлиять изменения в классе B. Сумма числа потенциально затронутых классов для каждого класса в системе равна общей сложности системы.
Вы можете прочитать больше в моем блоге:
http://aviadezra.blogspot.com/2009/05/uml-association-aggregation-composition.html