Patrón Composite:
Ejemplos:
Cálculo de Gasto en Sueldos Mensuales
"El patrón Composite sirve para construir algoritmos u objetos complejos a partir de otros más simples y similares entre sí, gracias a la composición recursiva y a una estructura en forma de árbol. Esto simplifica el tratamiento de los objetos creados, ya que al poseer todos ellos una interfaz común, se tratan todos de la misma manera. " (ref. 1)
Se debe utilizar este patrón cuando:
- Se busca representar una jerarquía de objetos como “parte-todo”.
- Se busca que el cliente puede ignorar la diferencia entre objetos primitivos y compuestos (para que pueda tratarlos de la misma manera).
Participantes:
Componente:
- Declara la interfaz para los objetos de la composición.
- Implementa el comportamiento por defecto para la interfaz común a todas las clases.
- Declara una interfaz para acceder y manejar a los componentes hijos.
- (opcional) Define una interfaz para acceder al padre del componente en la estructura recursiva, y la implementa si es preciso.
Hoja:
- Representa objetos hoja dentro del árbol de composición. Una hoja no tiene descendencia. (no se le pueden añadir hijos)
- Define el comportamiento para los objetos primitivos de la composición.
Compuesto:
- Define el comportamiento para los componentes que tienen descendencia.
- Aloja componentes hijos.
- Implementa las operaciones relativas a los hijos de la interfaz del Componente.
Cliente:
- Manipula los objetos de la composición a través de la interfaz del Componente
Ejemplo 1: Cálculo de gastos en sueldos mensuales
(Basado en el ejemplo de Maximiliano Juarez http://migranitodejava.blogspot.com.es/2011/06/composite.html pero ampliado)
"Hay que calcular el gasto mensual en sueldos del personal de un banco. El personal del banco esta divido en departamentos (Gerencia, Administrativo, RRHH, Cajas y Mantenimiento). A la vez Mantenimiento tiene personal de turno de noche y turno de dia, con distintos sueldo. Véase el siguiente esquema:
Sueldos según categoría:
- Gerente: 5000
- Oficial Adm.: 2500
- Ayud. Adm.: 1500
- Selectora: 2000
- Jefe Dep.: 3000
- Cajero:1200
- Mantenimiento Turno Día: 1800
- Mantenimiento Turno Noche: 2100
1) Muestre la estructura de los datos
2) calcule el gasto mensual.
3) Quitando el departamento de Mantenimiento ¿cual es el coste mensual?
4) Y si ademas quito a "Macarena" ¿en cuanto queda el coste?
Resolucion:
La organización de las clases del proyecto quedaria asi:
La clase Componente:
->
Nota: No he añadido los métodos (Agregar/borrar ) ya que en la clase Empleado (las hojas no tienen hijos) no tienen sentido y si se añaden en esta clase, como hereda de ella hay que anular los métodos. Asi queda más simple y la misma utilidad.
La clase Empleado (hoja)
-
La Clase Compuesto
Clases que heredan de Compuesto:
De esta clase Compuesto vamos a sacar varias clases (los departamentos, porque estas en un futuro tendrán sus métodos y atributos especializados del departamento). Defino la clase Banco, las otras clases (administracion, recursos humanos, mantenimiento, etc), serían igual inicialmente, pero ampliables en el futuro).
Ahora vamos a pasar al programa principal:
Aqui vemos varias zonas en el código:
1) Creamos los departamentos y empleados con sus datos. (lineas 3-20)
2) Añadimos a cada departamento sus empleados correspondientes. (lineas 22-37)
3) Añadimos al Banco los departamentos de los que esta compuesto. (lineas 39-47)
4) Pasamo al calculo. (linea 51)
5) Quitamos el departamento de Mantenimiento del Bank (linea 55)
6) Volvemos a calculcar el coste mensual.(linea 57)
7) Quitamos a Macarena del departamento de Adm. (linea 59)
8) En la linea 61, volvemos a mostrar como quedaria el coste mensual
Vista de como queda el programa
Enlace de descarga: enlace a box
Referencias:
1) http://zarza.usal.es/~fgarcia/
2) http://zarza.usal.es/~fgarcia/docencia/poo/04-05/Trabajos/Composite.pdf
Fuente imagen: http://ldc.usb.ve/~teruel/ci3711/poo3/