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);
}
}