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) ;
}
}