¿Cuál es la diferencia entre la relación Composición y Asociación?

En OOP, ¿cuál es la diferencia entre la composición (denotada por el diamante relleno en UML) y la relación de asociación (denotada por el diamante vacío en UML) entre las clases. Estoy un poco confundido. ¿Qué es la agregación? ¿Puedo tener un ejemplo convincente del mundo real?

COMPOSICIÓN

Imagine una empresa de software que se compone de diferentes Unidades de Negocio (o departamentos) como Storage BU, Networking BU. BU del automóvil El tiempo de vida de estas Unidades Comerciales se rige por la duración de la organización. En otras palabras, estas Unidades Comerciales no pueden existir de manera independiente sin la firma. Esto es COMPOSICIÓN. (es decir, la empresa está COMPUESTA DE unidades de negocio)

ASOCIACIÓN

La empresa de software puede tener proveedores externos que sirven comida a los empleados. Estas empresas de catering NO SON PARTE DE LA EMPRESA. Sin embargo, están ASOCIADOS con la empresa. Los servicios de restauración pueden existir incluso si nuestra empresa de software se cierra. ¡Pueden servir a otra empresa! Por lo tanto, la vida útil de los proveedores de servicios no se rige por la duración de la empresa de software. Esta es una ASOCIACIÓN típica

AGREGACIÓN

Considere una unidad de fabricación de automóviles. Podemos pensar en Car como una entidad completa y Car Wheel como parte del automóvil. (en este punto, puede parecerse a la composición … continúa) La rueda puede crearse semanas antes y puede sentarse en un depósito antes de ser colocada en un automóvil durante el assembly. En este ejemplo, la instancia de la clase Wheel claramente vive independientemente de la instancia de la clase Car. Por lo tanto, a diferencia de la composición, en agregación, los ciclos de vida de los objetos involucrados no están estrechamente relacionados.

Aquí hay algunos ejemplos:

  • Soy un empleado de una empresa, por lo tanto, estoy asociado a esa empresa. No soy parte de esto, ni lo compongo, pero sí estoy relacionado con él.

  • Estoy compuesto de órganos, que a menos que sean trasplantados, morirán conmigo. Esta es la composición, que es un enlace muy fuerte entre los objetos. Básicamente, los objetos están compuestos por otros objetos. El verbo dice todo.

  • También hay otro tipo de composición menos ligada, llamada agregación. Una agregación es cuando los objetos están compuestos por otros objetos, pero sus ciclos de vida no están necesariamente vinculados. Usando un ejemplo extremo, un juguete de Lego es una agregación de partes. Aunque el juguete se puede desmontar, sus partes se pueden recombinar para hacer un juguete diferente.

Poseer y usar

Composición: el objeto con la referencia posee el objeto al que se hace referencia, y es responsable de su “vida”, su destrucción (y, a menudo creación, aunque se puede pasar). También conocido como una relación has-a .

Asociación: el objeto con la referencia utiliza el objeto al que se hace referencia, puede no ser un usuario exclusivo y no es responsable de que se refiera a la duración del objeto. También conocido como una relación usos-a .

Los comentarios OP:

¿Puedes dar un ejemplo del mundo real? Además, ¿qué es la agregación? – Marc

Agregación: una asociación que es de una parte a otra, y que no puede ser cíclica.

Ejemplos:

Composición: un automóvil tiene un motor, una persona tiene una dirección. Básicamente, debe tener, controla el tiempo de vida.

Asociación: Un automóvil tiene un controlador, alguna instancia de clase tiene un ErrorLogger. Lifetime no controlado, puede ser compartido.

Agregación: un DOM (Modelo de Objeto de Documento, que son los objetos que componen un árbol de elementos HTML) Nodo tiene una (una matriz de) Nodos secundarios. El nodo es el nivel superior (bueno, más alto); “contiene” a sus hijos, no lo contienen.

Creo que un ejemplo basado en código puede ayudar a ilustrar los conceptos dados por las respuestas anteriores.

import java.util.ArrayList; public final class AssoCia { public static void main( String args[] ) { B b = new B(); ArrayList cs = new ArrayList(); A a = new A( b, cs ); a.addC( new C() ); a.addC( new C() ); a.addC( new C() ); a.listC(); } } class A { // Association - // this instance has a object of other class // as a member of the class. private B b; // Association/Aggregation - // this instance has a collection of objects // of other class and this collection is a // member of this class private ArrayList cs; private D d; public A(B b, ArrayList cs) { // Association this.b = b; // Association/Aggregation this.cs = cs; // Association/Composition - // this instance is responsible for creating // the instance of the object of the // other class. Therefore, when this instance // is liberated from the memory, the object of // the other class is liberated, too. this.d = new D(); } // Dependency - // only this method needs the object // of the other class. public void addC( C c ) { cs.add( c ); } public void listC() { for ( C c : cs ) { System.out.println( c ); } } } class B {} class C {} class D {} 

Por lo general, la composición significa que la vida útil del objeto contenido está limitada por la del contenedor, mientras que la asociación es una referencia a un objeto que puede existir independientemente.

Sin embargo, esta es solo la práctica que he observado. Odio admitirlo, ¡pero explorar las especificaciones de UML2 no está en mi lista de cosas divertidas que hacer!

Existencia independiente

Una factura se compone de artículos de línea.

¿Qué es una línea de pedido que no está en una factura? Es … bueno, no es nada. No puede existir de forma independiente.

Por otro lado, una Factura está asociada a un Cliente.

El cliente tiene una existencia independiente, con o sin una factura.

Si las dos cosas tienen existencia independiente, pueden estar asociadas.

Si una cosa no puede existir de manera independiente, entonces es parte de una composición.

La composición es una relación más estricta que la agregación. La composición significa que algo está tan fuertemente relacionado con otra cosa que básicamente no puede existir de forma independiente, o si pueden, viven en contextos diferentes.

Ejemplo del mundo real: define una ventana GUI y luego un campo de texto donde escribir algo. Entre la clase que define la GUI y la clase que define el campo de texto hay composición. Juntos, componen un widget que puede verse como una entidad en sí misma. Supongamos que elimina la ventana y elimina el campo de texto también.

La agregación es diferente, en el sentido de que el vínculo entre las dos entidades es temporal, inestable y ocasional. Un ejemplo del mundo real. Supongamos que tiene una base de datos de objetos que contienen múltiples instancias de datos. Ahora ejecuta un filtro para recostackr las instancias de datos que obedecen un criterio dado, y las instancias resultantes se insertan en una lista gráfica para que el usuario pueda verlas. Cuando el widget gráfico recibe los objetos, puede formar una agregación de estas entidades y presentarlas. Si el usuario cierra la ventana con la lista gráfica y esta última se elimina, los objetos de datos no se deben eliminar. Tal vez se muestren en otro lugar, o aún los necesites.

Además, en general, la composición se define en el momento de la creación. La agregación se define más adelante en la vida del objeto.

Composición significa que una parte del estado de la entidad está encapsulada por otro tipo, pero es conceptualmente parte del estado de la entidad. Por ejemplo, puede tener un tipo de dirección y un tipo de entidad de empleado que incluya una dirección.

Asociación significa que un tipo de entidad está asociado con otro tipo de entidad, pero la entidad asociada es conceptualmente no parte del estado de la entidad. Por ejemplo, un empleado puede estar asociado con una empresa.