Patrón Composite

[ Arquitectura  ]

El patrón composite nos da la utilidad de generar una composición de objetos variables. Esta composición, generalmente, se encuentra en forma de árbol y respeta una jerarquía.

A través de este polimorfismo variable de la citada jerarquía el encapsulamiento a ojos del cliente es muy sencilla y puede usarlos sin tener que conocer la profundidad del arbol y objetos generados.

En nuestro caso de la venta de libros, el supuesto donde aplicaríamos este patrón podrái ser en la distribucción de nuestro repositorio, tanto a clientes finales, como a editoriales más pequeñas, que pueden tener clientes.

Sin más, vamos al ejemplo con el que se verá más claro su estrucutura y comportamiento:

public abstract class Cliente {
    protected static double _costeLibroUnitario = 4.0;
    protected int _numeroLibros;

    public void AnadirLibro() => _numeroLibros += 1;

    public abstract double CalcularPedido();
    public abstract bool AgregarEditorial(Cliente nombreClienteEditorial);
}

public class ClienteFinal : Cliente {
    public override bool AgregarEditorial(Cliente filial) => false;
    public override double CalcularPedido() => _numeroLibros * _costeLibroUnitario;
}

public class EditorialCliente : Cliente {
   protected List<Cliente> _clientesEditorial = new List<Cliente>();

    public override double CalcularPedido()
    {
        double total = 0.0;

        foreach (Cliente clienteEditorial in _clientesEditorial)
        {
            total = total + clienteEditorial.CalcularPedido();
        }
        return total + _numeroLibros * _costeLibroUnitario;
    }

    public override bool AgregarEditorial(Cliente cliente)
    {
        _clientesEditorial.Add(cliente);
        return true;
    }
}

public class Pedido {
    static void Main(string[] args) {
        Cliente clienteFinal = new ClienteFinal();
        clienteFinal.AnadirLibro();

        Cliente otroClienteFinal = new ClienteFinal();
        otroClienteFinal.AnadirLibro();
        otroClienteFinal.AnadirLibro();

        Cliente editorialCliente = new EditorialCliente();
        editorialCliente.AgregarEditorial(clienteFinal);
        editorialCliente.AgregarEditorial(otroClienteFinal);
        editorialCliente.AnadirLibro();

        Console.WriteLine($"Total pedidos clientes: { editorialCliente.CalcularPedido() }");
}

El resultado que obtendremos será el calculo de los libro solicitados por los clientes.

Saludos.




@2017/@2024 - JRRN