DEV Community

Juarez Júnior for Develop4Us

Posted on • Edited on

1

C# Design Pattern: Observer (Portugues)

O padrão Observer é usado para notificar automaticamente múltiplos objetos quando o estado de outro objeto muda. Ele define uma relação "um-para-muitos" entre objetos, onde quando um objeto (o sujeito) muda, todos os seus observadores são notificados. É útil em situações onde várias partes do sistema precisam reagir às mudanças de um objeto, como em sistemas de eventos ou notificações.

Exemplo de Código em C#:

// Interface do Observador
public interface IObservador
{
    void Atualizar(string estado);
}

// Interface do Sujeito
public interface ISujeito
{
    void AdicionarObservador(IObservador observador);
    void RemoverObservador(IObservador observador);
    void NotificarObservadores();
}

// Implementação do Sujeito
public class SujeitoConcreto : ISujeito
{
    private List<IObservador> _observadores = new List<IObservador>();
    private string _estado;

    public string Estado
    {
        get { return _estado; }
        set
        {
            _estado = value;
            NotificarObservadores();
        }
    }

    public void AdicionarObservador(IObservador observador)
    {
        _observadores.Add(observador);
    }

    public void RemoverObservador(IObservador observador)
    {
        _observadores.Remove(observador);
    }

    public void NotificarObservadores()
    {
        foreach (var observador in _observadores)
        {
            observador.Atualizar(_estado);
        }
    }
}

// Implementação de Observadores
public class ObservadorConcreto1 : IObservador
{
    public void Atualizar(string estado)
    {
        Console.WriteLine($"Observador 1 foi notificado. Novo estado: {estado}");
    }
}

public class ObservadorConcreto2 : IObservador
{
    public void Atualizar(string estado)
    {
        Console.WriteLine($"Observador 2 foi notificado. Novo estado: {estado}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Criar o sujeito
        SujeitoConcreto sujeito = new SujeitoConcreto();

        // Criar e adicionar observadores
        ObservadorConcreto1 observador1 = new ObservadorConcreto1();
        ObservadorConcreto2 observador2 = new ObservadorConcreto2();

        sujeito.AdicionarObservador(observador1);
        sujeito.AdicionarObservador(observador2);

        // Alterar o estado do sujeito
        sujeito.Estado = "Estado A";
        sujeito.Estado = "Estado B";

        // Remover um observador e alterar o estado
        sujeito.RemoverObservador(observador1);
        sujeito.Estado = "Estado C";
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação do Código:
Neste exemplo, a classe SujeitoConcreto mantém uma lista de observadores e notifica todos os observadores registrados quando o estado muda. O método NotificarObservadores percorre a lista de observadores e chama o método Atualizar em cada um. Os observadores ObservadorConcreto1 e ObservadorConcreto2 reagem às mudanças de estado do sujeito.

Conclusão:
O padrão Observer é útil quando várias partes do sistema precisam ser informadas automaticamente sobre mudanças no estado de um objeto. Ele reduz o acoplamento entre o sujeito e os observadores, tornando o sistema mais flexível.

Código fonte: GitHub

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay