/*Esse código oferece maior flexibilidade ao configurar as ações observadoras e
ajuda a evitar a necessidade de chamar vários métodos AdicionarObserver.
Além disso, essa abordagem é mais intuitiva, pois você configura todas as ações no mesmo local onde o NotaFiscalBuilder é criado.*/
using System;
using System.Collections.Generic;
namespace notaFiscalObserver{
// Interface para os Observers
public interface INotaFiscalObserver
{
void ExecutarAcoes(NotaFiscal notaFiscal);
}
// Classe NotaFiscal
public class NotaFiscal
{
public int Numero { get; set; }
public decimal ValorTotal { get; set; }
// Outros atributos da nota fiscal
public NotaFiscal(int numero, decimal valorTotal)
{
Numero = numero;
ValorTotal = valorTotal;
}
}
// Classe Observer (NotaFiscalBuilder)
public class NotaFiscalBuilder
{
private List<INotaFiscalObserver> observers;
public NotaFiscalBuilder(List<INotaFiscalObserver> observers)
{
this.observers = observers;
}
public NotaFiscal GerarNotaFiscal(int numero, decimal valorTotal)
{
NotaFiscal notaFiscal = new NotaFiscal(numero, valorTotal);
// Realizar outras ações necessárias para gerar a nota fiscal
// Notificar os Observers
foreach (var observer in observers)
{
observer.ExecutarAcoes(notaFiscal);
}
return notaFiscal;
}
}
// Observers para envio de e-mail, persistência no banco de dados e ações personalizadas
public class EnviarEmailObserver : INotaFiscalObserver
{
public void ExecutarAcoes(NotaFiscal notaFiscal)
{
Console.WriteLine($"Enviando e-mail com a nota fiscal número {notaFiscal.Numero}");
}
}
public class PersistirBancoDadosObserver : INotaFiscalObserver
{
public void ExecutarAcoes(NotaFiscal notaFiscal)
{
Console.WriteLine($"Persistindo nota fiscal número {notaFiscal.Numero} no banco de dados");
}
}
public class AcaoPersonalizadaObserver : INotaFiscalObserver
{
private Action<NotaFiscal> acao;
public AcaoPersonalizadaObserver(Action<NotaFiscal> acao)
{
this.acao = acao;
}
public void ExecutarAcoes(NotaFiscal notaFiscal)
{
acao.Invoke(notaFiscal);
}
}
public class Program
{
public static void Main(string[] args)
{
// Configurar os observadores
List<INotaFiscalObserver> observers = new List<INotaFiscalObserver>
{
new EnviarEmailObserver(),
new PersistirBancoDadosObserver(),
new AcaoPersonalizadaObserver(nota =>
{
double fator = 1.5;
decimal valorMultiplicado = nota.ValorTotal * (decimal)fator;
Console.WriteLine($"Valor da nota fiscal número {nota.Numero} multiplicado por {fator}: {valorMultiplicado}");
})
};
// Criar o construtor de notas fiscais com os observadores configurados
NotaFiscalBuilder builder = new NotaFiscalBuilder(observers);
// Gerar a nota fiscal e executar as ações observadoras
NotaFiscal notaFiscal = builder.GerarNotaFiscal(123, 1000.00m);
}
}
}