Resolvi o exercício de uma forma diferente do proposto, o que vocês acham?
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
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;
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
public enum Formato {
XML,
CSV,
PORCENTO;
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
public class Requisicao {
private Formato formato;
public Requisicao(Formato formato){
this.formato = formato;
}
public Formato getFormato() {
return formato;
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
public interface Resposta {
String responde(Requisicao requisicao, Conta conta, Resposta nextResposta);
boolean podeResponder(Requisicao requisicao);
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
public class XML implements Resposta {
@Override
public String responde(Requisicao requisicao, Conta conta, Resposta nextResposta) {
if(podeResponder(requisicao)){
GeradorDeResposta gerarResposta = new GeraXML();
try {
return gerarResposta.gerar(conta);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
return nextResposta.responde(requisicao, conta, new Porcento());
}
@Override
public boolean podeResponder(Requisicao requisicao) {
return requisicao.getFormato().equals(Formato.XML);
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
public class Porcento implements Resposta {
@Override
public String responde(Requisicao requisicao, Conta conta, Resposta resposta) {
if (podeResponder(requisicao)) {
GeradorDeResposta geradorDeResposta = new GeraPorcento();
try {
return geradorDeResposta.gerar(conta);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
throw new RuntimeException("Impossivel gerar Resposta");
}
@Override
public boolean podeResponder(Requisicao requisicao) {
return requisicao.getFormato().equals(Formato.PORCENTO);
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
public class CSV implements Resposta {
@Override
public String responde(Requisicao requisicao, Conta conta, Resposta nextResposta) {
if (podeResponder(requisicao)) {
GeradorDeResposta geradorDeResposta = new GeraCSV();
try {
return geradorDeResposta.gerar(conta);
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
return nextResposta.responde(requisicao, conta, null);
}
@Override
public boolean podeResponder(Requisicao requisicao) {
return requisicao.getFormato().equals(Formato.CSV);
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
import java.lang.reflect.Field;
public class GeraPorcento implements GeradorDeResposta {
@Override
public String gerar(Conta conta) throws IllegalArgumentException, IllegalAccessException {
final Class<?> clazz = conta.getClass();
StringBuilder stringBuilder = new StringBuilder();
for(Field field : clazz.getDeclaredFields()){
field.setAccessible(true);
stringBuilder.append(""+field.get(conta)+"%");
}
return stringBuilder.toString();
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
import java.lang.reflect.Field;
public class GeraXML implements GeradorDeResposta {
@Override
public String gerar(final Conta conta) throws IllegalArgumentException, IllegalAccessException {
final Class<?> clazz = conta.getClass();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<"+clazz.getSimpleName()+">\n");
for(Field field : clazz.getDeclaredFields()){
stringBuilder.append("<"+field.getName()+">");
field.setAccessible(true);
stringBuilder.append("<"+field.get(conta)+">");
stringBuilder.append("</"+field.getName()+">\n");
}
stringBuilder.append("</"+clazz.getSimpleName()+">\n");
return stringBuilder.toString();
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
import java.lang.reflect.Field;
public class GeraCSV implements GeradorDeResposta{
@Override
public String gerar(Conta conta) throws IllegalArgumentException, IllegalAccessException {
final Class<?> clazz = conta.getClass();
StringBuilder stringBuilder = new StringBuilder();
for(Field field : clazz.getDeclaredFields()){
field.setAccessible(true);
stringBuilder.append(""+field.get(conta)+";");
}
return stringBuilder.toString();
}
}
package br.com.welisson.designPatterns.chainOfResponsibility.exercice2;
public class ResponderRequisicao {
private Requisicao requisicao;
private Conta conta;
public ResponderRequisicao(Requisicao requisicao, Conta conta) {
this.requisicao = requisicao;
this.conta = conta;
}
public String responder(){
return new XML().responde(requisicao, conta, new CSV());
}
}