Padrões de Design - Padrão Observador

O Padrão Observador, também conhecido como padrão publicar-subscriver ou modelo-visão, é um padrão comportamental de objetos. Ele resolve o cenário em que, quando um objeto sofre uma alteração, todos os objetos dependentes devem ser notificados e reagir a essa mudança.

Vantagens incluem o acoplamento abstrato entre o alvo e os observadores, utilizando um mecanismo de notificação. No entanto, ainda há dependência, e se o alvo tiver muitos observadores, a eficiência pode ser impactada.

Os objetos necessários para este padrão são: o alvo, que é o objeto que pode mudar; os observadores, que dependem do alvo; e os eventos, que representam abstrações das mudanças ocorridas.

Em Java, existem classes específicas para este padrão: Observable e Observer.

Considere um exemplo prático: um objeto transformável (alvo) e dois observadores que reagem a suas mudanças. Quando o objeto se transforma, os observadores são notificados e respondem de acordo.

Abaixo, segue uma implementação de exemplo em Java, com nomes e estruturas modificados para ilustrar o padrão.

Classe alvo (objeto transformável):

package com.exemplo.padrao.observador;

import java.util.Observable;

public class ObjetoTransformavel extends Observable {
    private String estadoAtual;

    public String getEstadoAtual() {
        return estadoAtual;
    }

    public void mudarEstado(String novoEstado) {
        this.estadoAtual = novoEstado;
        setChanged();
        notifyObservers(novoEstado);
    }
}

Primeiro observador:

package com.exemplo.padrao.observador;

import java.util.Observable;
import java.util.Observer;

public class ObservadorAlpha implements Observer {
    @Override
    public void update(Observable fonte, Object argumento) {
        String estado = String.valueOf(argumento);
        if (estado.equals("ativo")) {
            System.out.println("ObservadorAlpha reage positivamente");
        } else if (estado.equals("inativo")) {
            System.out.println("ObservadorAlpha reage negativamente");
        } else {
            System.out.println("ObservadorAlpha sem resposta específica");
        }
    }
}

Segundo observador:

package com.exemplo.padrao.observador;

import java.util.Observable;
import java.util.Observer;

public class ObservadorBeta implements Observer {
    @Override
    public void update(Observable fonte, Object argumento) {
        String estado = String.valueOf(argumento);
        if (estado.equals("ativo")) {
            System.out.println("ObservadorBeta reage positivamente");
        } else if (estado.equals("inativo")) {
            System.out.println("ObservadorBeta reage negativamente com detalhes adicionais");
        } else {
            System.out.println("ObservadorBeta sem resposta específica");
        }
    }
}

Classe de teste para demonstrar o uso:

package com.exemplo.padrao.observador;

public class TestePadrao {
    public static void main(String[] args) {
        new TestePadrao().executarExemplo("inativo");
    }

    public void executarExemplo(String estado) {
        ObjetoTransformavel objeto = new ObjetoTransformavel();
        objeto.addObserver(new ObservadorAlpha());
        objeto.addObserver(new ObservadorBeta());
        objeto.mudarEstado(estado);
    }
}

Tags: java Padrão Observador Desenho de Software Programação Orientada a Objetos

Publicado em 6-14 19:06 por Thomas