Olá, boa noite.
Obrigado por ter respondido.
Ainda acho estranho um "executa" dentro de um DAO, parece fora de contexto.
Tipo: O DAO vai executar o quê? Uma peristência?! Então faz mais sentido o "persiste" ou "salvar".
Também parece errado amarrar o DAO com a interface "AcaoAposGerarNota".
Não entendi quando vc disse: "até porque com o uso dessa interface ele passa a receber uma List."
O "executa" da interface recebe só um "NotaFiscal".
Eu tentei usar o Adapter, mas não ficou muito elegante.
Segue o exemplo:
package ex2.dao;
public class DAO<T> {
public void persiste(T t){
System.out.println("salva no banco");
}
}
package ex2.dao;
import ex2.notafiscal.NotaFiscal;
public class NotaFiscalDao extends DAO<NotaFiscal> {
@Override
public void persiste(NotaFiscal t) {
System.out.println("salva no banco nf: " + t.getId());
}
}
package ex2.email;
import ex2.notafiscal.NotaFiscal;
import ex2.notafiscal.acao.AcaoAposGerarNota;
public class EnviadorDeEmail implements AcaoAposGerarNota{
public void executa(NotaFiscal nf) {
System.out.println("envia email da nf " + nf.getId());
}
}
package ex2.fatura;
import ex2.imposto.Imposto;
import ex2.notafiscal.NotaFiscal;
public class Fatura {
private double valorMensal;
private String cliente;
public Fatura() {}
public Fatura(double valorMensal, String cliente) {
this.valorMensal = valorMensal;
this.cliente = cliente;
}
public double getValorMensal() {
return valorMensal;
}
public void setValorMensal(double valorMensal) {
this.valorMensal = valorMensal;
}
public String getCliente() {
return cliente;
}
public void setCliente(String cliente) {
this.cliente = cliente;
}
public NotaFiscal gerarNotaFiscal(Imposto imposto){
return new NotaFiscal(this.valorMensal, imposto.calcular(valorMensal));
}
}
package ex2.imposto;
public interface Imposto {
public double calcular(double valor);
}
package ex2.imposto;
public class ImpostoSimples implements Imposto {
public double calcular(double valor) {
return valor * 0.06;
}
}
package ex2.notafiscal;
public class NotaFiscal {
private int id;
private double valorBruto;
private double impostos;
public NotaFiscal(int id, double valorBruto, double impostos) {
this.id = id;
this.valorBruto = valorBruto;
this.impostos = impostos;
}
public NotaFiscal(double valorBruto, double impostos) {
this(0, valorBruto, impostos);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getValorBruto() {
return valorBruto;
}
public void setValorBruto(double valorBruto) {
this.valorBruto = valorBruto;
}
public double getImpostos() {
return impostos;
}
public void setImpostos(double impostos) {
this.impostos = impostos;
}
public double getValorLiquido() {
return this.valorBruto - this.impostos;
}
}
package ex2.notafiscal.acao;
import ex2.notafiscal.NotaFiscal;
public interface AcaoAposGerarNota {
public void executa(NotaFiscal nf);
}
package ex2.notafiscal.adapter;
import ex2.dao.DAO;
import ex2.notafiscal.NotaFiscal;
import ex2.notafiscal.acao.AcaoAposGerarNota;
public class AcaoAposGerarNotaDAOAdapter implements AcaoAposGerarNota{
private DAO dao;
public AcaoAposGerarNotaDAOAdapter(DAO dao) {
this.dao = dao;
}
public void executa(NotaFiscal nf) {
dao.persiste(nf);
}
}
package ex2.main;
import java.util.Arrays;
import java.util.List;
import ex2.dao.NotaFiscalDao;
import ex2.email.EnviadorDeEmail;
import ex2.fatura.Fatura;
import ex2.imposto.ImpostoSimples;
import ex2.notafiscal.NotaFiscal;
import ex2.notafiscal.acao.AcaoAposGerarNota;
import ex2.notafiscal.adapter.AcaoAposGerarNotaDAOAdapter;
public class Main {
public static void main(String[] args) {
EnviadorDeEmail enviadorDeEmail = new EnviadorDeEmail();
NotaFiscalDao notaFiscalDao = new NotaFiscalDao();
Fatura fatura = new Fatura(230.52, "Henrique");
NotaFiscal nf = fatura.gerarNotaFiscal(new ImpostoSimples());
List<AcaoAposGerarNota> acoes = Arrays.asList(enviadorDeEmail, new AcaoAposGerarNotaDAOAdapter(notaFiscalDao));
for (AcaoAposGerarNota acaoAposGerarNota : acoes) {
acaoAposGerarNota.executa(nf);
}
}
}
Tenho pouco conhecimento de Patterns, então não tenho certeza se foi bem aplicado. Ainda mais nesse caso.
Abs.