Observer
Mantendo seus objetos atualizados
•
•
•
•
•
Daniel Roloff
Carlos Machado
Enzo Zuccolotto
Luiz Felipe Trevisan
Rafael Holtz
Imagine…
• Uma editora começa a publicar jornais;
• Você assina-o e todo dia recebe os mesmos;
• Você cancela a assinatura quando não quizer
mais recebê-los e eles param de chegar;
• A editora entrega jornais para pessoas, hotéis,
companhias aéreas e outras empresas fazem e
cancelam assinaturas constantemente.
ESTE É O OBSERVER!
Imagine…
• Um alarme programado para despertar;
• Você adiciona eventos ao despertar o alarme.
• Quando alarme desperta, a torradeira se liga, o
café começa a ser passado e o rádio começa a
tocar sua rádio preferida.
ESTE É O OBSERVER!
Definições
Define a dependência um-para-muitos entre
objetos para que quando um objeto mude de
estado todos os seus dependentes sejam
avisados e atualizados automaticamente.
Utilizando baixo encapsulamento!
Definições
Nome: Observer(Publicacao- Assinatura)
Problema: diferentes tipos de objetos assinantes estão
interessados nas mudanças de estado ou nos eventos de um
objeto publicador e cada um quer reagir de sua propria
maneira exclusiva quando o publicador gerar um evento. Além
disso, o publicador quer manter acoplamento fraco com os
assinantes. O que fazer?
Solução: defina uma interface “assinante” ou “ouvinte”. Os
assinantes implementam essa interface. O publicador pode
registrar dinamicamente os assintantes que estejam
interessados em um evento e notificá-los quando um evento
ocorrer.
Definições
• Padrão Comportamental, isto é, define o
comportamento dos objetos.
• Não permite que a estrutura interna do objeto
que está se comunicando seja exposta.
• Swing utiliza muito este padrão, assim como
muitos frameworks GUI.
• Também será encontrado em outros lugares
como JavaBeans e RMI.
Participantes
• Subject:
- conhece seus observadores. Um número qualquer de
objetos Observer pode observar um subject.
- fornece uma interface para acrescentar e remover objetos
para associar e desassociar objetos observer.
• Observer:
- define uma interface de atualização para objetos que
deveriam ser notificados sobre mudancas em um subject.
Participantes
• ConcreteSubject:
- armazena estados de interesse para objetos
ConcreteObserver.
- envia uma notificação para os seus observadores quando
seu estado muda.
• ConcreteObsever:
- mantém uma referência para um objeto ConcreteSubject.
- armazena estados que deveriam permanecer consistentes
com os do Subject.
- implementa a interface de atualização de observer, para
manter seu estado consistente com o do subject.
Diagrama de Classes
Contêm o
estado
eo
controla
O método
update é
chamado
quando o
estado de
Subject é
alterado
Java
• Java tem uma implementação própria;
• É necessário estender a superclasse
java.util.Observable (Péssimo!)
• Possui um método setChanged() utilizado para
informar que deve ser enviado o estado para as
demais classes.
• Útil para quando o estado varia muito e
queremos acionar os observadores só em
determinados casos.
Exemplo
• Vamos ao código! Try it!
Desvantagens
• A necessidade de extender uma classe na
implementação default do Java
• Não é possível nem usar composição já que o
método setChanged é privado
• Deve-se otimizar as notificações para que não
sobrecarregar os observadores
Bibliografia
• Padrões de Projeto – Use a Cabeça – Eric
Freeman e Elisabeth Freeman
• Spring Loaded Observer Pattern – Scott Priolo
http://www.theserverside.com/tt/articles/artic
le.tss?l=SpringLoadedObserverPattern
• Utilizando UML e Padrões - Craig Larman
• Padrões de Projeto. Erich Gamma.
Dúvidas?
Download

Disciplina