Patron Composite - tectijuana/javapdd16a-Archived GitHub Wiki
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.
-
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"
-
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.
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