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

Estou com dúvida no curso de Design Patterns para bons programadores, no exercício 5 do capítulo Códigos parecidos e o Template Method.

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?

6 respostas

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.");
        }
    }
solução!

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.