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?