Páginas

martes, 5 de noviembre de 2013

Patrón Composite: Ejemplos: Cálculo de Gasto en Sueldos Mensuales

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
Realizar programa que:
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/docencia/poo/04-05/Trabajos/Composite.pdf
2) http://zarza.usal.es/~fgarcia/docencia/poo/04-05/Trabajos/Composite.pdf