Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Dúvida no Ex. 4 da Aula 2 - Muitos Descontos e o Chain of Responsibility

Oi Marco

Não temos o código pronto, vou tentar fazer e postar aqui. Enquanto isso, não quer postar o seu código pra irmos olhando? :)

4 respostas

Ok, Mario, lá vai...

public class Conta {

    private String titular;
    private double saldo;

    public Conta (String titular, double saldo) {
        this.titular = titular;
        this.saldo = saldo;
    }

    public String getTitular() {
        return titular;
    }

    public double getSaldo() {
        return saldo;
    }
}

public enum Formato {

    XML,
    CSV,
    PORCENTO
}

public class Requisicao {

    private Formato formato;
    public Requisicao (Formato formato) {
        this.formato = formato;
    }

    public Formato getFormato() {
        return formato;
    }
}

public interface Resposta {

    void responde(Requisicao req, Conta conta);
    void setProxima(Resposta resposta);
}

public class RespostaEmXML implements Resposta {

    private Resposta outraResposta;

    public void responde(Requisicao req, Conta conta) {
      if(req.getFormato() == Formato.XML) {
        System.out.println("<conta><titular>" + conta.getTitular() + "</titular><saldo>" + conta.getSaldo() + "</saldo></conta>");
      }
      else {
        outraResposta.responde(req, conta);
      }
    }

    public void setProxima(Resposta resposta) {
      this.outraResposta = resposta;
    }
}

public class RespostaEmCsv implements Resposta{

    private Resposta outraResposta;

    public void responde(Requisicao req, Conta conta) {
      if(req.getFormato() == Formato.CSV) {
        System.out.println(conta.getTitular() + ";" + conta.getSaldo());
      }
      else {
        outraResposta.responde(req, conta);
      }
    }

    public void setProxima(Resposta resposta) {
      this.outraResposta = resposta;
    }
}

public class RespostaEmPorcento implements Resposta {

    private Resposta outraResposta;

    public void responde(Requisicao req, Conta conta) {
      if(req.getFormato() == Formato.PORCENTO) {
        System.out.println(conta.getTitular() + "%" + conta.getSaldo());
      }
      else {
        outraResposta.responde(req, conta);
      }
    }

    public void setProxima(Resposta resposta) {
      this.outraResposta = resposta;
    }
}

public class DefinidorDeResposta {

    public void define (Conta conta) {

        Resposta r1 = new RespostaEmXML();
        Resposta r2 = new RespostaEmCsv();
        Resposta r3 = new RespostaEmPorcento();

        r1.setProxima(r2);
        r2.setProxima(r3);

    }
}

public class TestaResposta {

    public static void main(String[] args) {

        Conta conta = new Conta ("Marco Tulio", 1000.0);
        Formato formato = Formato.PORCENTO;
        Requisicao rq = new Requisicao (formato);
        DefinidorDeResposta dr = new DefinidorDeResposta();
        dr.define(conta);

        for (Formato tipo : Formato.values()) {
            tipo = formato;
            if (tipo == Formato.XML) {
                Resposta rp = new RespostaEmXML();
                rp.responde(rq, conta);
                break;
            } else if (tipo == Formato.CSV)    {
                Resposta rp = new RespostaEmCsv();
                rp.responde(rq, conta);
                break;
            } else {
                Resposta rp = new RespostaEmPorcento();
                rp.responde(rq, conta);
                break;
            }
        }
    }
}

Oi Marco, tudo bem? Vendo sua resposta, tudo parece perfeito. A solução será exatamente essa, em breve será adicionada no curso (está em nossa lista de prioridades). A única mudança, que será sugerida em outro exercício, será trocar o setResposta pelo construtor, que é uma alternativa bem mais interessante --mas não vou dar spoiler! rs. Ficou com alguma dúvida sobre esse pattern? Um abraço

solução

Muito obrigado, Rodrigo, pelo incentivo.

Alguém poderia apresentar para mim o código completo deste exercício, para que eu possa comparar com o meu?