Padrão Observer: Notificação de Eventos
Implemente Observer para desacoplar produtores e consumidores de eventos em um sistema de preços de ações.
Padrão Observer: Notificação de Eventos é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
A intenção de Observer
Observer (também chamado de Publicar-Assinar) define uma dependência de um para muitos: quando o estado do assunto muda, todos os observadores registrados são notificados automaticamente.
Interfaces de Subject e Observer
O assunto mantém uma lista de observadores e os notifica. Os observadores implementam um método update para reagir aos eventos.
public interface Observer {
void update(String event, Object data);
}
public interface Subject {
void addObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers(String event, Object data);
}Assunto concreto: cotação de ações
O assunto mantém o estado e chama notifyObservers sempre que o estado muda. Ele gerencia a lista de observadores.
public class StockTicker implements Subject {
private final List<Observer> observers = new ArrayList<>();
private double price;
public void addObserver(Observer o) { observers.add(o); }
public void removeObserver(Observer o) { observers.remove(o); }
public void setPrice(double p) {
this.price = p;
notifyObservers("PRICE_CHANGED", p);
}
public void notifyObservers(String ev, Object data) {
for (Observer o : observers) o.update(ev, data);
}
}Observadores concretos
Cada observador reage de forma diferente à mesma notificação. Adicione observadores em tempo de execução sem modificar o assunto.
public class AlertSystem implements Observer {
public void update(String ev, Object data) {
if ((double) data < 100) System.out.println("ALERT: Low price!");
}
}
public class Logger implements Observer {
public void update(String ev, Object data) {
System.out.println("LOG: " + ev + " = " + data);
}
}Conectando observadores
Registre os observadores no assunto. Todos reagem quando o assunto muda. Remova o registro para deixar de receber atualizações.
StockTicker ticker = new StockTicker();
ticker.addObserver(new AlertSystem());
ticker.addObserver(new Logger());
ticker.setPrice(95.5); // both observers notifiedjava.util.Observable — obsoleto
O JDK tinha java.util.Observable e java.util.Observer, mas eles estão obsoletos desde o Java 9. Implemente sua própria solução ou utilize bibliotecas reativas como RxJava ou Project Reactor.
PropertyChangeListener
Os beans Java fornecem PropertyChangeSupport, um mecanismo integrado de Observer para alterações nas propriedades dos beans, muito utilizado no Swing e no JavaFX.
public class Model {
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private int value;
public void addPropertyChangeListener(PropertyChangeListener l) { pcs.addPropertyChangeListener(l); }
public void setValue(int v) {
int old = this.value; this.value = v;
pcs.firePropertyChange("value", old, v);
}
}Observer funcional com Consumer
Utilize Consumer<T> como um observador leve em vez de uma interface dedicada — é perfeito para retornos de chamada simples de eventos.
List<Consumer<Double>> listeners = new ArrayList<>();
listeners.add(p -> { if (p < 100) System.out.println("Low price"); });
listeners.add(p -> System.out.println("Price: " + p));
double newPrice = 95.5;
listeners.forEach(l -> l.accept(newPrice));Observer versus barramento de eventos
Um barramento de eventos (como o Guava EventBus) desacopla ainda mais o assunto e o observador — o assunto publica eventos no barramento sem saber quem os escuta. Os observadores se inscrevem por meio de uma anotação de método.
// Guava EventBus example
EventBus bus = new EventBus();
bus.register(new Logger()); // subscribe
bus.post(new PriceEvent(95.5)); // publishSegurança em execução concorrente no Observer
Se observadores puderem ser adicionados ou removidos de vários fluxos de execução, proteja a lista com synchronized ou utilize CopyOnWriteArrayList em cenários com muitas notificações.
private final List<Observer> observers = new CopyOnWriteArrayList<>();Evitando vazamentos de memória
Referências fortes na lista de observadores impedem a coleta pelo GC. Utilize WeakReference<Observer> ou sempre remova o registro dos observadores quando eles não forem mais necessários.
Observer em frameworks reais
O ApplicationEventPublisher do Spring, o LiveData do Android e as propriedades do JavaFX são todos exemplos do padrão Observer em diferentes níveis de abstração.
Verificação rápida
Qual é o principal benefício do padrão Observer?
Recapitulação
Observer define uma cadeia de notificações de um para muitos. Implemente-o por meio de interfaces ou consumidores funcionais. Utilize CopyOnWriteArrayList para garantir a segurança em execução concorrente e sempre remova o registro dos observadores para evitar vazamentos.
Perguntas Frequentes
A aula “Padrão Observer: Notificação de Eventos” é grátis?
Sim — o texto completo de “Padrão Observer: Notificação de Eventos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Padrão Observer: Notificação de Eventos”?
Implemente Observer para desacoplar produtores e consumidores de eventos em um sistema de preços de ações. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Padrão Observer: Notificação de Eventos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Padrão Observer: Notificação de Eventos
- Padrão Strategy: Algoritmos Intercambiáveis
- Padrão Command: Encapsulamento de Ações
- Template Method: Definição de Esqueletos de Algoritmos