Neste caso o padrão a aplicar é o Composite. Este padrão permite tratar conjunto de itens como se fossem itens isolados, evitando assim que o código cliente tenha que distinguir se está a lidar só com um item isolado ou com um conjunto de itens. Assim, é necessário definir uma nova entidade no sistema que representa o conjunto de produtos alimentares com o comportamento indicado relativamente às funcionalidades de um produto alimentar. Esta nova classe, GrupoProdutoAlimentares, corresponde à entidade Composite do padrão a aplicar e irá concretizar a interface ProdutoAlimentar (tal como indicado pela estrutura do padrão) por forma a que o código cliente não tenha que distinguir se está a lidar com um produto alimentar isolado ou com um conjunto de produtos alimentares. Assim, após a aplicação deste padrão, a alteração a realizar ao código é a seguinte:
public class GrupoProdutoAlimentares implements ProdutoAlimentar {
private List<ProdutoAlimentar> _produtos;
public ConjuntoProdutos() {
_produtos = new ArrayList<>();
}
public void add(ProdutoAlimentar p) {
_produtos.add(p);
}
public int obtemPreco() {
int preco = 0;
for (ProdutoAlimentar p : _produtos)
preco += p.obtemPreco();
return p*0.9;
}
public String obtemDescricao() {
String str = "";
for (ProdutoAlimentar p : _produtos)
str += p.obtemDescricao() + "\n";
return str;
}
}