1
resposta

Exemplo de implementação de ações do Observer através de um construtor (Builder)

/*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);

    }
}

}
1 resposta

Olá Caroline! Bom dia.

A implementação que você mostrou é um exemplo de como usar o padrão de projeto Builder para criar uma nota fiscal com ações observadoras. Parabéns pela implementação.

Além disso, essa abordagem oferece maior flexibilidade ao configurar as ações observadoras. Se você tivesse um método AdicionaAcao(), precisaria chamar esse método várias vezes para adicionar todas as ações desejadas. Com a lista passada pelo construtor, você pode adicionar todas as ações de uma vez só.

Continue focada e praticando sempre!