Diagrama UML do padrão Observer.

O Observer é um padrão de projeto de software que define uma dependência um-para-muitos entre objetos de modo que quando um objeto muda o estado, todos seus dependentes são notificados e atualizados automaticamente. Permite que objetos interessados sejam avisados da mudança de estado ou outros eventos ocorrendo num outro objeto.

O padrão Observer é também chamado de Publisher-Subscriber, Event Generator e Dependents.

Descrição de um problema

editar

Suponha que temos um programa que representa vários gráficos de uma pesquisa científica e utiliza vários dados para representar esse gráfico, e se um dado for atualizado o programa deve atualizar os gráficos. Para esse problema, uma solução poderia ser manter uma lista com as possíveis representações e ficar verificando por mudanças nos conjuntos de dados, assim que fosse feita mudança, as representações que está na lista seriam avisadas.

Essa solução não é a melhor pois precisamos sempre verificar se houve essas mudanças no conjunto, e dessa forma o processamento seria muito caro, ou então a atualização seria demorada. Portanto, o padrão Observer resolve esse problema.[1]

Motivação

editar

Um objeto que possua agregações deve permitir que seus elementos sejam acessados sem que a sua estrutura interna seja exposta. De uma maneira geral pode-se desejar que estes elementos sejam percorridos em várias ordens.

Como garantir que objetos que dependem de outro objeto percebam as mudanças naquele objeto?

  • Os observadores (observer) devem conhecer o objeto de interesse.
  • O objeto de interesse (subject) deve notificar os observadores quando for atualizado.

Os objetos devem interligar-se entre si de forma a que não se conheçam em tempo de compilação de forma a criar o acoplamento e desfazê-lo a qualquer momento em tempo de execução. Solucionar isso fornece uma implementação muito flexível de acoplamento de abstrações.

Aplicabilidade

editar

O padrão Observer pode ser usado quando uma abstração tem dois aspectos, um dependente do outro. Encapsular tais aspectos em objetos separados permite que variem e sejam reusados separadamente. Quando uma mudança a um objeto requer mudanças a outros e você não sabe quantos outros objetos devem mudar ou quando um objeto deve ser capaz de avisar outros sem fazer suposições sobre quem são os objetos. Em outras palavras, sem criar um acoplamento forte entre os objetos.

Consequências

editar
  • Possibilita baixo acoplamento entre os objetos dependentes (os observers) e o assunto.
  • Acoplamento abstrato.
  • Suporte para broadcast.
  • Dificuldade em saber o que foi mudado.

Exemplos

editar

Em Java

editar
public interface Observer{
    void update(Observable o);
}

public class ConcreteObserverA implements Observer{

    public void update(Observable o){
        ObservableData data = (ObservableData) o;
        data.getData();
    }
}

public class ConcreteObserverB implements Observer{

    public void update(Observable o){
        ObservableData data = (ObservableData) o;
        data.getData();
    }
}

public abstract Subject{
    List observers = new ArrayList<>();

    public void add(Observer o){
        observers.add(o);
    }

    public void remove(Observer o){
        observers.remove(o);
    }

    public void notify(){
        Iterator it = observers.iterator();
        while(it.hasNext()){
            Observer o = (Observer)it.next();
            o.update(this);
        }
    }
}

public class SubjectData extends Subject{
    private Object myData;

    public void setData(Object myData){
        this.myData = myData;
        notify();
    }

    public Object getData(){
        return myData;
    }
}

Em C# 6.0[2]

editar
using System;

namespace ObserverDesign
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create subject
            var subject = new Subject();

            //Create observers
            var observerA = new Observer { Identifier = "A" };
            var observerB = new Observer { Identifier = "B" };

            //Register observers
            subject.Update += observerA.Update;
            subject.Update += observerB.Update;

            //Notify observers
            subject.Notify();
        }
    }

    public class Subject
    {
        public event Action Update;

        public void Notify() => Update?.Invoke();
    }

    public class Observer
    {
        public string Identifier { get; set; }

        public void Update() => Console.WriteLine($"My Identifier = {Identifier}");
    }
}

Referências

📚 Artikel Terkait di Wikipedia

Direitos das pessoas transgênero nos Estados Unidos

Valenta, L. J.; Elias, A. N.; Domurat, E. S. (março de 1992). «Hormone pattern in pharmacologically feminized male transsexuals in the California State

Alan Turing

Douglas R. (1985). Metamagical Themas: Questing for the Essence of Mind and Pattern. Basic Books. [S.l.: s.n.] ISBN 978-0-465-04566-2. OCLC 230812136  Hodges

Padrão de projeto de software

europeu) ou padrão de projeto (português brasileiro) (do inglês design pattern) é uma solução geral para um problema que ocorre com frequência dentro

Violência policial nos Estados Unidos

Division (1 de janeiro de 2003). «Department of Justice Police Misconduct Pattern or Practice Program». U.S. Department of Justice. Consultado em 27 de agosto

Trumpismo

Money-Kyrle. [S.l.]: Clunie Press. Money-Kyle describes not a rhetorical pattern of problem–conflict–resolution, but a progression of psychoanalytic states

Tentativas de anular a eleição presidencial de 2020 nos Estados Unidos

Boschma, CNN. Yourish, Karen; Smart, Charlie (24 de maio de 2024). «Trump's Pattern of Sowing Election Doubt Intensifies in 2024» [O padrão de Trump de semear

Atividade solar e clima

1016/S1364-6826(03)00041-5  Damon, Paul E.; Paul Laut (28 de Setembro de 2004). «Pattern of Strange Errors Plagues Solar Activity and Terrestrial Climate Data»

Exército dos Estados Unidos

Operational Camouflage Pattern (OCP); OCP substituiu um padrão baseado em pixels conhecido como Universal Camouflage Pattern (UCP) em 2019. Em 11 de