Eu fiz com o Strategy, envio o relatório para uma classe geradora de relatório e ela executa o metodo gera de cada estratégia, seria ruim? é melhor Chain of Responsibility ou ainda combinar os 3 padrões aprenditos até esta aula?
Eu fiz com o Strategy, envio o relatório para uma classe geradora de relatório e ela executa o metodo gera de cada estratégia, seria ruim? é melhor Chain of Responsibility ou ainda combinar os 3 padrões aprenditos até esta aula?
O template ficaria assim combinado com Chain Of Responsibility?
package TemplateMethod;
import java.util.List;
import ChainOfResponsibility.Conta;
import ChainOfResponsibility.Relatorio;
public abstract class TemplateDeRelatorioPorTipo implements Relatorio {
private Relatorio proximo;
public TemplateDeRelatorioPorTipo(Relatorio proximo) {
this.proximo = proximo;
}
@Override
public void gera(Banco banco) {
if (relatorioDeveSerGerado()) {
montaCabecalho(banco);
montaCorpo(banco.getContas());
montaRodape(banco);
} else if (proximo != null) {
proximo.gera(banco);
} else {
throw new RuntimeException("O tipo de relatório não foi informado.");
}
}
protected abstract boolean relatorioDeveSerGerado();
private void montaCorpo(List<Conta> contas){
for (Conta conta : contas) {
formataConta(conta);
}
}
protected abstract void montaCabecalho(Banco banco);
protected abstract void formataConta(Conta conta);
protected abstract void montaRodape(Banco banco);
}
No relatório Simples, por exemplo, o método ficou assim:
@Override
protected boolean relatorioDeveSerGerado(Relatorio relatorio) {
return relatorio instanceof RelatorioSimples;
}
Oi Camila,
Não entendi bem seu código. Cadê o Chain?
Um abraço!
Desculpa, na verdade tentei usar Template Method com o Chain que seria o trecho a seguir:
@Override
public void gera(Banco banco) {
if (relatorioDeveSerGerado()) {
montaCabecalho(banco);
montaCorpo(banco.getContas());
montaRodape(banco);
} else if (proximo != null) {
proximo.gera(banco);
} else {
throw new RuntimeException("O tipo de relatório não foi informado.");
}
}
Oi Camila,
Agora entendi. É isso aí.
Agora, o que eu faria pra melhorar o código desse (e de qquer Chain of Responsibility) é esconder esse else-if/else-throw. Talvez usando herança. Aí o código fica mais claro.
O que acha?
Um abraço!
Gostei, obrigada novamente.