“Bom dia. Meu tema é o padrão Observer, um dos padrões comportamentais do catálogo da Gangue dos Quatro.”
Não leia o subtítulo. Vá direto ao problema; a definição vem depois.
“Imagina um e-commerce. O pedido foi pago. A partir daí quatro coisas precisam acontecer: mandar e-mail, baixar estoque, emitir nota e avisar a logística.”
“A solução ingênua é a classe Pedido chamar os quatro serviços. Funciona até chegar o quinto. Aí você abre Pedido de novo, e ela agora conhece e-mail, estoque, fiscal e logística.”
“A outra saída seria cada serviço ficar perguntando ‘já pagou?’. É polling: desperdício e atraso.”
Feche com a caixa verde, devagar: o acoplamento está no lugar errado.
“A ideia do Observer é inverter isso: em vez de perguntar, você se inscreve. Quando o estado muda, o aviso vem até você.”
“A definição formal do GoF é essa: dependência um-para-muitos. Um objeto muda, todos os dependentes são notificados automaticamente.”
Leia só os trechos em negrito da citação. Cite os outros nomes em uma frase.
“Estruturalmente são quatro papéis e duas interfaces.”
“O Subject é quem tem algo a anunciar: guarda a lista e expõe inscrever, cancelar e notificar. O Observer é a interface de quem quer ser avisado, normalmente com um método só.”
“Embaixo, as implementações concretas. A seta verde é o coração do padrão: notificar() chama atualizar() em cada observador. A tracejada de volta é o observador lendo o estado.”
Aponte o losango no topo: é a agregação que garante que o Subject só conhece o tipo Observer.
“Em sequência fica ainda mais claro. Passos 1 e 2: o cliente inscreve dois observadores no pedido.”
“Passo 3, o estado muda: setStatus(PAGO). Esse é o gatilho.”
“Passos 4 a 7: o pedido percorre a lista e chama atualizar() em cada um. Cada observador lê o que precisa e faz o seu trabalho.”
Frase-chave: “o Pedido não sabe o que esses dois fazem, só sabe que os dois implementam a interface.”
“Em código cabe numa tela. À esquerda, a interface com um método e o Subject: uma lista, inscrever, cancelar e o setStatus que chama notificar() logo depois de mudar o estado.”
“À direita, dois observadores concretos que não se conhecem. E o uso: instancia, inscreve os dois, muda o status, e os dois reagem.”
“O ponto principal está embaixo: para acrescentar a nota fiscal, eu crio uma classe e chamo inscrever. A classe Pedido não muda. Isso é o Princípio Aberto/Fechado.”
Se o tempo apertar, vá direto à caixa verde. Cite o List.copyOf só se perguntarem.
“Tem uma decisão de projeto aqui: quem carrega o dado.”
“No push, o Subject manda os valores no próprio aviso. É direto, mas ele precisa adivinhar do que cada observador precisa, e a assinatura do método incha.”
“No pull, o aviso é só ‘eu mudei’ e cada um busca o que interessa. É o que está no código do slide anterior.”
Feche: na prática se usa híbrido, um objeto de evento com o essencial.
“E isso não é só teoria. Todo mundo aqui já escreveu um Observer sem saber.”
“addEventListener é literalmente isso: o botão é o subject, a sua função é o observer. React e Vue: o componente observa o estado. Spring tem @EventListener, Django tem signals, e webhook é Observer pela rede: a loja avisa o seu servidor que houve uma venda.”
Não leia os oito. Escolha três que a turma conheça e diga que o resto está no slide.
“Resumindo os ganhos: baixo acoplamento, porque o Subject só conhece a interface. Aberto/Fechado, porque dá para estender sem editar. Vínculo dinâmico, porque a lista muda em execução. E broadcast de graça.”
Ritmo rápido. É um slide de confirmação.
“Mas todo padrão cobra um preço.”
“O clássico é o lapsed listener: você esqueceu de cancelar a inscrição, o Subject continua segurando a referência e o objeto nunca é coletado. Vazamento de memória.”
“Segundo: a ordem não é garantida. Se o estoque precisa baixar antes de o e-mail sair, o Observer sozinho não resolve.”
“E o que mais dói no dia a dia: depuração. Você vê o estado mudar e não vê quem reagiu.”
Dê tempo a esse slide. É aqui que você mostra profundidade.
“Uma confusão comum: Observer e Publish/Subscribe são a mesma coisa?”
“Mesma intenção, escalas diferentes. No Observer o Subject tem a lista, existe referência direta. No Pub/Sub há um broker no meio: quem publica nem sabe se existem assinantes, e a entrega é assíncrona, entre máquinas.”
Fecho: “Pub/Sub é o Observer com um intermediário.”
“O critério prático. Use quando uma mudança exige reações que você não conhece de antemão, quando o número de interessados varia em execução e quando quer separar o que aconteceu do que fazer a respeito.”
“Evite quando só há um dependente fixo, porque aí a chamada direta é mais clara. E evite quando ordem, entrega garantida ou transação forem requisitos: isso é trabalho de fila.”
“Fechando com três frases: o Observer troca ‘eu te chamo’ por ‘me avise’. Quem emite não precisa conhecer quem reage. E o preço é a rastreabilidade.”
“Obrigado. Alguma pergunta?”
As perguntas prováveis, com resposta, estão no Resumo (botão no topo).