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.