Patron Composite - tectijuana/javapdd16a-Archived GitHub Wiki

Patrón Composite

El patrón Composite nos permite construir objetos complejos partiendo de otros más sencillos utilizando una estrategia de composición recursiva. Podemos equiparar este patrón a un panal y sus celdas. Cada objeto simple (celda) puede relacionarse con otros formando una estructura más compleja (panal).

También se puede usar este patrón para tratar a todos los componentes de la estructura en árbol para, mediante una interfaz o superclase, establecer unas reglas de comportamiento que nos permitan tratar a todos los elementos de la misma manera.

Intensión del patrón

  • Componer objetos en estructuras de árbol para representar jerarquías totales o parciales. El patrón Composite permite a los clientes tratar objetos individuales y compuestos de manera uniforme.

  • Composición recursiva. "Los directorios contienen entradas y cada una de ellas puede ser un directorio"

Ventajas

  • Permite jerarquías de objetos tan complejas como se quiera. Allá donde el cliente espere un objeto primitivo, podrá recibir un compuesto y no se dará cuenta.

  • Simplifica el cliente. Al eliminar el código para distinguir entre unos y otros.

  • Se pueden añadir nuevos componentes fácilmente.

###Desventajas

Podría hacer el diseño demasiado general, especialmente cuando queremos restringir los componentes que pueden formar parte de un compuesto determinado.

Aplicaciones

Utilícese el patrón Composite para:

  • Representar jerarquías de parte-todo.

  • Que los clientes traten por igual los objetos individuales y los compuestos.


/** "Composite"*/
Programa
    public abstract class Empresa{
    protected static double costeUnitarioVehiculo = 5.0;protected int nVehiculos;`
    public void agregaVehiculo(){nVehiculos = nVehiculos + 1;}`
    public abstract double calculaCosteMantenimiento();`
    public abstract boolean agregaFilial(Empresa filial);`
    }

   public class EmpresaSinFilial extends Empresa
   {
    public boolean agregaFilial(Empresa filial)
   {
   return false;
   }
  public double calculaCosteMantenimiento()
  {
  return nVehiculos * costeUnitarioVehiculo;
  }
  }
  import java.util.*;
  public class EmpresaMadre extends Empresa
  {
  protected List<Empresa> filiales =
  new ArrayList<Empresa>();
  public boolean agregaFilial(Empresa filial)
  {
   return filiales.add(filial);
  }
  public double calculaCosteMantenimiento()
  {
    double coste = 0.0;
    for (Empresa filial: filiales)
    coste = coste + filial.calculaCosteMantenimiento();
    return coste + nVehiculos * costeUnitarioVehiculo;
  }
  }
  public class Usuario
  {
   public static void main(String[] args)
  { 
    Empresa empresa1 = new EmpresaSinFilial();
    empresa1.agregaVehiculo();
    Empresa empresa2 = new EmpresaSinFilial();
    empresa2.agregaVehiculo();
    empresa2.agregaVehiculo();
    Empresa grupo = new EmpresaMadre();
    grupo.agregaFilial(empresa1);
    grupo.agregaFilial(empresa2);
    grupo.agregaVehiculo();
    System.out.println("Coste de mantenimiento total del grupo: " + grupo.calculaCosteMantenimiento());
  }
 }

http://www.seas.es/blog/informatica/patrones-de-diseno-en-java-patron-composite/ http://programacionsolida.com.ar/2012/03/patrones-de-diseno-estructurales.html http://rootear.com/desarrollo/patron-composite

⚠️ **GitHub.com Fallback** ⚠️