Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Dúvida no Ex. 4 da Aula 4 - Comportamentos compostos por outros comportamentos e o Decorator

Boa noite,

Teria como avaliar se a forma que eu implementei está de acordo com o padrão Decorator e se essa seria mesmo a melhor forma ser feito.

public abstract class FiltroGenerico {

    private FiltroGenerico proximoFiltro;

    public FiltroGenerico(FiltroGenerico proximoFiltro) {
        this.proximoFiltro = proximoFiltro;

    }

    public FiltroGenerico() {

    }

    public final List<Conta> filtra(List<Conta> contas) {
        List<Conta> contasFiltradas = montaFiltro(contas);        
        contasFiltradas.addAll(proximoFiltro(contas));

        return contasFiltradas;

    }    

    private final List<Conta> proximoFiltro(List<Conta> contas) {
        if (this.proximoFiltro != null) {
            return proximoFiltro.filtra(contas);
        } else {
            return new ArrayList<Conta>();
        }
    }

    protected final List<Conta> montaFiltro(List<Conta> contas) {
        List<Conta> contasFraudulentas = new ArrayList<Conta>();

        for (Conta conta : contas) {
            if (criterioFraudulenta(conta)) {
                contasFraudulentas.add(conta);
            }
        }

        return contasFraudulentas;
    }

    protected abstract boolean criterioFraudulenta(Conta conta);

}

public class FiltroSaldoBaixo extends FiltroGenerico {

    public FiltroSaldoBaixo() {
        super();
    }

    public FiltroSaldoBaixo(FiltroGenerico proximoFiltro) {
        super(proximoFiltro);
    }

    @Override
    protected boolean criterioFraudulenta(Conta conta) {
        return conta.getSaldo() < 100;
    }


}

public class filtroSaldoAlto extends FiltroGenerico{



    public filtroSaldoAlto() {
        super();
        // TODO Auto-generated constructor stub
    }

    public filtroSaldoAlto(FiltroGenerico proximoFiltro) {
        super(proximoFiltro);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected boolean criterioFraudulenta(Conta conta) {
        return conta.getSaldo() > 500000;
    }

}

public class FiltroDataAbertura extends FiltroGenerico {



    public FiltroDataAbertura() {
        super();
        // TODO Auto-generated constructor stub
    }

    public FiltroDataAbertura(FiltroGenerico proximoFiltro) {
        super(proximoFiltro);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected boolean criterioFraudulenta(Conta conta) {
        return conta.getDataAbertura().get(Calendar.MONTH) == Calendar.getInstance().get(Calendar.MONTH) && 
                conta.getDataAbertura().get(Calendar.YEAR) == Calendar.getInstance().get(Calendar.YEAR) ;
    }

}
5 respostas

Olá Matheus! Sim, Você está aplicando o padrão Decorator, no entanto, achei os métodos criterioFraudulenta e montaFiltro meios desnecessários, aumentaram um pouco sua classe. Veja que na resposta do exercício eles não existem

Espero ter ajudado! Bons Estudos!

Romário, se não me engano na resposta do exercicio esse metodo "monta filtro" é implementado em todas as classes filhas, por isso achei melhor fazer apenas uma vez na classe generica e na filha só implementar a condição da busca ( o que vai no if ) por isso o criterioFraudulenta. Mas acho que não foge muito da proposta né?

abs e obrigado pelo retorno.

solução!

Olá Matheus! Então, na resposta do exercício não existe o método montaFiltro(). Mas vamos analisar.. Veja que sua classe tem o método filtra então esse método é o que deve ser que realiza a filtragem. So que pelo seu código você delegou a filtragem ao montaFiltro, ou seja o método filtra() apenas delega a filtragem para o montaFiltro e depois chama o próximo e ai sucessivamente. Então veja que esse montaFiltro() não é bem necessário ele poderia ser eliminado simplesmente ficando da seguinte forma:

public final List<Conta> filtra(List<Conta> contas) {
        List<Conta> contasFiltradas = new ArrayList<Conta>();

        for (Conta conta : contas) {
            if (criterioFraudulenta(conta)) {
                contasFiltradas.add(conta);
            }
        }

        contasFiltradas.addAll(proximoFiltro(contas));
        return contasFiltradas;

    }

Eu entendi o método critérioFraudulenta depois de ler novamente e realmente você fez uso de boas práticas ao cria-lo. No entanto, seu código ficou um pouco confuso por causa do montaFiltro. Até me confundiu e por isso disse que ambos não eram necessários. Mas concordo que o criterioFraudulenta seja uma boa prática pois assim você não precisa repetir sempre o código de percorrer a ArrayList.

Espero ter ajudado! Bons Estudos!

Aah blz, você mostrando agora vejo que o montafiltro era desnecessário mesmo, muito obrigado

Cuti sua implementação Matheus! Vou usar o criterioFraudulenta também, acho que esse seria o padrão Template, correto?