Padrão Observer: Entenda seu Funcionamento e Implementação

Imagine que você tem um sistema que precisa avisar vários interessados quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. algo muda, como um serviço de alerta de meteorologia, enviando notificações sempre que a temperatura ultrapassar certo limite. Em vez de cada componente ficar perguntando (constantemente) se há alguma novidade, o Observer faz esse trabalho para você: quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. ocorre uma mudança, todo mundo fica sabendo automaticamente. Esse é o padrão Observer🎮 Projeto: Sistema de Notificações com Observer e DI!🎮 Projeto: Sistema de Notificações com Observer e DI!Descubra como sincronizar notificações em um sistema de delivery com o padrão Observer e Dependency Injection em C#. Obtenha código limpo, modular e escalável..

Conteúdo🔗

Como Funciona?🔗

O Observer é formado por duas figuras principais:

Em termos práticos, cada vez que acontece uma mudança no sujeito (por exemplo, o valor de uma temperatura ou a cotação de uma ação), ele chama um método em cada observador🎮 Projeto: Sistema de Notificações com Observer e DI!🎮 Projeto: Sistema de Notificações com Observer e DI!Descubra como sincronizar notificações em um sistema de delivery com o padrão Observer e Dependency Injection em C#. Obtenha código limpo, modular e escalável. inscrito, notificando que algo mudou.

Exemplo do Mundo Real🔗

Pense em um sistema de estoque de um e-commerce. O setor de vendas🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio., a contabilidade, o time de logística... todos precisam saber quando o estoque acaba ou se ele é reabastecido. Implementando o Observer, assim que o estoque for🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! atualizado, todos os departamentos inscritos recebem um alerta. Dessa forma, não é preciso que cada departamento fique consultando o estoque a cada 5 minutos.

Implementação Básica🔗

No C#, podemos usar eventos e delegates para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! representar o Observer. Por exemplo:

public class Estoque
{
    // Observa quando o estoque é atualizado
    public event Action<int> EstoqueAtualizado;
    private int _quantidade;
    public int Quantidade
    {
        get => _quantidade;
        set
        {
            _quantidade = value;
            // Ao mudar a quantidade, notifica os observadores
            EstoqueAtualizado?.Invoke(_quantidade);
        }
    }
}
public class DepartamentoFinanceiro
{
    public void AssinarNotificacoes(Estoque estoque)
    {
        estoque.EstoqueAtualizado += ReceberNotificacao;
    }
    private void ReceberNotificacao(int qtd)
    {
        Console.WriteLine($"[Financeiro] Estoque atualizado para {qtd} unidades.");
    }
}

1. A classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. Estoque tem um evento chamado EstoqueAtualizado.

2. Quando a quantidade🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. muda, chama-se EstoqueAtualizado?.Invoke(_quantidade).

3. Um observador🎮 Projeto: Sistema de Notificações com Observer e DI!🎮 Projeto: Sistema de Notificações com Observer e DI!Descubra como sincronizar notificações em um sistema de delivery com o padrão Observer e Dependency Injection em C#. Obtenha código limpo, modular e escalável., como DepartamentoFinanceiro, se inscreve nesse evento (+=) e, quando ocorre uma mudança, recebe a notificação pelo método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. ReceberNotificacao.

Implementação Alternativa com Interfaces

Você também pode implementar o Observer usando interfaces📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas., como no exemplo abaixo:

public interface IObserver
{
    void Update(string message);
}
public class Subject
{
    private List<IObserver> _observers = new List<IObserver>();
    public void AddObserver(IObserver observer)
    {
        _observers.Add(observer);
    }
    public void NotifyObservers(string message)
    {
        foreach (var observer in _observers)
        {
            observer.Update(message);
        }
    }
}
public class EmailNotifier : IObserver
{
    public void Update(string message)
    {
        Console.WriteLine($"Email enviado: {message}");
    }
}
public class SMSNotifier : IObserver
{
    public void Update(string message)
    {
        Console.WriteLine($"SMS enviado: {message}");
    }
}

Exemplo Prático: Sistema de Notificação de Estoque

Contexto: Um sistema de e-commerce que alerta quando um produto🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. está em estoque baixo.

public class EstoqueManager : Subject
{
    private int _quantidade;
    public void AtualizarEstoque(int novaQuantidade)
    {
        _quantidade = novaQuantidade;
        if (_quantidade < 5)
        {
            NotifyObservers($"ALERTA: Estoque baixo ({_quantidade} unidades)");
        }
    }
}
// Configuração dos Observers
var estoque = new EstoqueManager();
estoque.AddObserver(new EmailNotifier());
estoque.AddObserver(new SMSNotifier());
// Simular atualização de estoque
estoque.AtualizarEstoque(3);
// Saída:
// Email enviado: ALERTA: Estoque baixo (3 unidades)
// SMS enviado: ALERTA: Estoque baixo (3 unidades)

Vantagens e Limitações🔗

Vantagens

Limitações

Conclusão🔗

O Observer funciona como um verdadeiro sistema de alerta: em vez de cada componente ficar impaciente perguntando “e aí, mudou alguma coisa?”, basta se inscrever e receber a notificação em tempo real. Esse padrão simplifica muito a comunicação e traz mais organização ao código. Ele se encaixa bem em cenários como atualização de interface gráfica, monitoramento🚀 Kubernetes: Orquestração de Microservices na Nuvem!🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade. de estoque, sistemas de mensagens e qualquer solução em que alterações precisam ser comunicadas para múltiplos interessados de forma automática.

Quando Usar o Observer?

💡 Dica profissional: Em .NET 8+, use IObservable<T> e IObserver<T> nativos para implementações mais robustas!

Pronto para criar seu próprio sistema de alertas📊 Monitoramento com Prometheus: Métricas em Tempo Real!📊 Monitoramento com Prometheus: Métricas em Tempo Real!Descubra como implementar o Prometheus para monitoramento em sistemas .NET, com métricas em tempo real e dashboards inteligentes.? O Observer é uma ferramenta poderosa para manter componentes sincronizados sem criar dependências rígidas. Experimente em seu próximo projeto🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes.! 🔔

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados