Pessoal
Tenho que fazer o seguinte:
Minha aplicação tem que gerar documentos, que podem ser de dois tipos. Um completo e um resumido, com praticamente as mesmas informações.
Estou pensando em o que é melhor fazer neste caso. Implementar isto utilizando Template Method, mais ou menos desta forma:
public abstract class GeraDocumento {
public final void gera(){
geraSecao1();
geraSecao2();
geraSecao3();
}
public abstract void geraSecao1();
public abstract void geraSecao2();
public abstract void geraSecao3();
}
public class GeraDocumentoResumido extends GeraDocumento {
public void geraSecao1(){
// faz alguma coisa
}
public void geraSecao2(){
// nao faz nada, o resumido nao tem esta secao...
}
public void geraSecao3(){
// faz alguma coisa
}
}
public class GeraDocumentoCompleto extends GeraDocumento {
public void geraSecao1(){
// faz alguma coisa
}
public void geraSecao2(){
// faz alguma coisa
}
public void geraSecao3(){
// faz alguma coisa
}
}
Na minha opinião, isto parece bom, a não ser pelo fato de que na classe GeraDocumentoResumido, alguns métodos estarão em branco (só estarão lá porque precisam ser implementados, pois são abstratos na classe pai) e não farão nada…
Por outro lado, se usasse o Chain of Responsibility, eu poderia definir o que é chamado, mais ou menos assim:
public class GeraSecao1 extends GeraDocumento {
private GeraDocumento sucessor;
public void gera(){
// faz alguma coisa
if(sucessor != null)
sucessor.gera();
}
public void setSucessor(GeraDocumento sucessor){
this.sucessor = sucessor;
}
}
public class GeraSecao2 extends GeraDocumento {
private GeraDocumento sucessor;
public void gera(){
// faz alguma coisa
if(sucessor != null)
sucessor.gera();
}
public void setSucessor(GeraDocumento sucessor){
this.sucessor = sucessor;
}
}
public class GeraSecao3 extends GeraDocumento {
private GeraDocumento sucessor;
public void gera(){
// faz alguma coisa
if(sucessor != null)
sucessor.gera();
}
public void setSucessor(GeraDocumento sucessor){
this.sucessor = sucessor;
}
}
public class GeraDocumentoCompleto {
public void gera(){
GeraDocumento g1 = new GeraSecao1();
GeraDocumento g2 = new GeraSecao2();
GeraDocumento g3 = new GeraSecao3();
g1.setSucessor(g2);
g2.setSucessor(g3);
}
}
public class GeraDocumentoResumido {
public void gera(){
GeraDocumento g1 = new GeraSecao1();
GeraDocumento g3 = new GeraSecao3();
g1.setSucessor(g3);
}
}
Isto também parece bom, pois me permite chamar somente aquilo que eu quero, na ordem que eu quero, mas o ponto negativo é que algumas seções são diferentes (pequenas diferenças) entre a versão completa e a resumida. A mesma versão apresenta informações diferentes, em alguns casos (poucos, mas existem) e, neste caso, eu teria que criar muitas classes a mais e talvez duplicar código ou fazer um monte de condicionais.
O que vocês acham a respeito? O que vocês fariam neste caso?
Obrigado
