2012-01-30 21 views
23

estoy terminando un curso sobre los patrones de diseño, y si bien la revisión de las notas se encontraron con algo que había perdido durante el semestre: Compuesto vs Composición. Lo que logré entender es que el compuesto es cuando un objeto en realidad encapsula objetos enteros, mientras que la composición es cuando solo contiene punteros a ellos.Diseño patrones: Composite vs. Composición

  1. ¿Es esto correcto? ¿Puede alguien explicarme esto un poco mejor?
  2. ¿Cuándo preferiría una sobre la otra?

Respuesta

45

Composition

Este es un concepto de diseño (no es realmente un patrón). Este término se usa cuando quiere describir un objeto que contiene otro. Ocurre muy a menudo en la discusión Composition over inheritance.

Además, la composición implica una fuerte propiedad. Un objeto posee (es decir, gestiona el ciclo de vida) de otro objeto. Cuando los padres son destruidos, todos los niños son destruidos también. Si no existe una relación tan fuerte (los niños pueden sobrevivir a los padres) estamos hablando de agregación.

Citando gran ejemplo en Wikipedia:

Por ejemplo, una universidad posee varios departamentos (por ejemplo, química), y cada departamento tiene un número de profesores. Si la universidad cierra, los departamentos ya no existirán, pero los profesores en esos departamentos continuarán existiendo. Por lo tanto, una Universidad se puede ver como una composición de los departamentos, mientras que los departamentos tienen una agregación de profesores. Además, un profesor podría trabajar en más de un departamento, pero un departamento no podría formar parte de más de una universidad.

Como puede ver, debe elegir entre la composición o la agregación dependiendo del tipo de relación de propiedad.

Composite pattern

Este es un patrón de diseño GoF describir un padre-hijo fuerte relación en la que el niño puede ser un nodo simple o un contenedor de otros nodos (que contiene posiblemente otros niños).

Es muy común en la interfaz gráfica de usuario y la estructura similar a un árbol. P.ej. en Java Swing a JPanel puede contener varios controles como campos de texto, etiquetas, listas, etc. pero también puede contener otros JPanel s que, a su vez, pueden contener componentes simples y aún más paneles anidados.

Normalmente compuesto patrón de diseño utiliza la composición, sin embargo, en algunos casos, el padre no tiene que ser el propietario de todos los hijos. Para continuar el ejemplo de GUI, puede tomar un panel y moverlo a otro lugar (cambie el elemento principal).

+0

+1 para explicar los dos, pero el OP * también * parecía necesitar ayuda en el contenido versus solo tener un problema con el puntero. –

+0

@MattFenwick: a la derecha, agregué algunas aclaraciones y citas (también sobre la agregación). –

+1

Gracias. ¿Qué es GoF? – baruch