Considere o seguinte domínio.


Um restaurante vende produtos alimentares, entre os quais, refeições. Cada produto tem um preço e uma descrição. O restaurante mantém o registo das compras efectuadas por cada cliente. Uma refeição é constituída por um ou mais ingredientes e cada ingrediente tem um dado grupo alimentar (representado por uma cadeia de caracteres) e um preço. O preço de cada refeição é calculado em função dos seus ingredientes. A descrição de uma refeição indica os seus ingredientes. As entidades produto alimentar e refeição são representadas pelas seguintes classes:

public interface ProdutoAlimentar {
    int obtemPreco();
    String obtemDescricao();
}

public class Refeicao implements ProdutoAlimentar {
    private List<Ingrediente> _ingredientes;
    public Refeicao(List>Ingrediente> ing) {
        // ...
    }
    
    public int obtemPreco() {
        // ...
    }

    public String obtemDescricao() {
        // ...
    }
}


Considere agora o seguinte requisito. Por forma a aumentar o consumo de produtos alimentares, um cliente agora pode comprar vários produtos ao mesmo tempo e o preço deste conjunto tem um desconto de 10%, face ao somatório do preço dos vários elementos que compõem a escolha do cliente. A descrição do conjunto de produtos é o resultado da concatenação das descrições dos vários produtos que constituem o conjunto a comprar. O restaurante vai continuar a necessitar de manter o registo dos vários produtos comprados por um cliente e não se quer distinguir entre a situação em que o cliente comprou um único produto alimentar ou um conjunto de produtos alimentares por forma a manter o código simples e não ser necessário alterar o código já realizado. 

Aplicando o padrão Composite, acrecente o código que permite cumprir o requisito indicado. Compare a sua solução com a seguinte solução.