Boa noite!
Encontrei alguns ajustes para a implementação de resposata da atividade 4 do padrão de projeto Decorator, sei que são coisas sem muita relevância, mas a intenção é só informar mesmo, um abraço, seguem abaixo:
01 - Ajustes na super classe (Filtro), ficou faltando o tipo de retorno do método ( protected List proximo(List contas) )
protected proximo(List<Conta> contas) {
if(outroFiltro != null) return outroFiltro.filtra(contas);
else return new ArrayList<Conta>();
}
02 - Todas as classes que herdam da super classe ( Filtro ), possuem um erro no método ( filtra(List contas) ), observe que a conta que atende a condição do filtro atual é adicionada a lista de itens filtrados mas não é retirada da lista que é passada para o método ( proximo(contas) ), desta forma uma mesma conta é adicionada a lista de contas filtradas mais de uma vez caso atenda a condição de mais de um filtro.
public List<Conta> filtra(List<Conta> contas) {
List<Conta> filtrada = new ArrayList<Conta>();
for(Conta c : contas) {
if(c.getValor() < 100) filtrada.add(c);
}
filtrada.addAll(proximo(contas));
return
}