1 Strategy Definição: Quando usar? Tipo de padrão? Como?Def: padrão que permite que o comportamento de uma classe (i.e., seu algoritmo) seja mudado em tempo de execução. Quando usar? Quando o algoritmo a ser usado deve ser escolhido em tempo de execução. Tipo de padrão? Comportamental (existem os de criação, comportamentais e estruturais) Como? Composição + Interfaces Programar para superclasses! Por que? Com a variável de referência de uma superclasse nós podemos instanciar objetos de sub-classe (que encapsulam diferentes algoritmos/estratégias) e atribuir a essa referência em tempo de execução. Com isto a estratégia é mudada.
2 Terminologia e Estruturainterface Strategy class Context
3 Exemplos Xadrez Interface Strategy: +move() Class Piece: -Strategy strategy +move() file compression tool - where we create either zip or rar files Quais os tipos de movimento nós temos no xadrez? Quais peças? Como ficaria o Main?
4 "A melhor parte de ser um observador, é que você enxerga o que ninguém vê, sabe o que ninguém sabe, e aprende coisas que ninguém aprende.“ - Ricardo Sousa Junior POO Observer Prof. Eduardo Falcão
5 Padrão Observer Como manter objetos atualizados quando algo importante ocorre? Como permitir que os objetos decidam se querem ser informados das mudanças em tempo de execução?
6 Como assinaturas de jornais e revistas funcionam?Uma editora começa a publicar jornais; Você assina o jornal de uma editora; Até aqui tudo bem... você ainda é um assinante, então você continua recebendo os jornais diariamente; Você recebe a seguinte notícia: Você cancela a assinatura; Os jornais param de ser entregues a você. Massss... Note que o fato de você ter deixado de assinar não implica que o jornal deixa de existir... Os outros assinantes continuam recebendo seus exemplares
7 Como o padrão Observer funciona?Subject, do inglês “assunto”, é o objeto que muda com frequência. É o objeto importante nos quais podem haver outros objetos interessados em seu estado/valor. Observer, como o próprio nome diz, se refere àqueles objetos que observam algum objeto do tipo Subject, pois eles estão interessados em seu estado. A forma comum do padrão observer é um Objeto Subject enviar atualizações para seus observadores. Note que P4 não é um observador, logo ele não recebe as atualizações de Subject, i.e. ele não recebe as revistas. ;) Objeto Subject P3 Objetos de Observer P4
8 Como o padrão Observer funciona?Mas, P4 pode abruptamente se interessar pelo conteúdo da revista. Se P4 deseja receber os exemplares semanais da VEJA, ele deve assinar a revista, caso contrário a VEJA jamais irá adivinhar esse desejo de P4. Objeto Subject P3 “Me registre, quero assinar” Objetos de Observer P4
9 Como o padrão Observer funciona?Agora que P4 é um assinante/observador, na próxima semana, assim que a Veja entregar suas revistas, P4 receberá a sua. Objeto Subject P3 P4 Objetos de Observer
10 Como o padrão Observer funciona?“Cancele minha assinatura” P1 P2 Da mesma forma que é possível assinar, também é possível cancelar a assinatura se aquelas informações já não são mais importantes para um objeto, no nosso exemplo, P1. Objeto Subject P3 P4 Objetos de Observer
11 Como o padrão Observer funciona?O padrão OBSERVER 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. P2 P3 Objeto Subject P4 Objetos de Observer P1
12 O diagrama de classes do padrão ObserverPensemos no exemplo da Revistas e Assinantes Se nós queremos que a nossa arquitetura seja flexível, uma boa ideia seria usar Interfaces, ao invés de classes. No nosso exemplo, isso permitiria adicionarmos uma empresa como Observador, ou mesmo criar uma outra classe e torná-la observadora de Editora. Faríamos isso sem precisar alterar muito código. [Fazer modelo UML interativamente com os alunos.]
13
14 Exercício (15 min) Agora que nós temos uma ideia inicial de como funciona o padrão Observer, que tal criar um primeiro programa que utiliza este padrão? Vamos utilizar o exemplo anterior. No nosso programa nós teremos uma classe Editora e uma classe Pessoa. Obviamente, Editora é o nosso subject e Pessoa o nosso observer. Crie um programa que permita uma Editora publicar revistas para seus assinantes. Como testar? Crie quatro objetos do tipo Pessoa, mas inicialmente apenas três deles assinarão a Editora. Faça a editora publicar um exemplar (revista). Faça a pessoa que não era assinante se tornar assinante. Publique outra revista. Cancele a assinatura de qualquer pessoa e publique a ultima revista. Mostrar código após término do exercício.
15 Editoras e Assinantes Mostrar implementação
16 Fraco acoplamento Quando dois objetos estão levemente ligados eles interagem sem saber muita coisa um do outro. Esse fraco acoplamento torna o programa flexível para receber novas alterações. A única coisa que um Subject sabe sobre um observador é que ele implementa uma certa interface; Podemos adicionar novos Observers a qualquer momento; Nunca precisamos modificar o Subject para adicionar novos tipos de Observers; Alterações no Subject e no Observer não irão afetar um ao outro já que eles implementam interfaces. Ninguém pode quebrar o contrato. A única coisa que um sujeito sabe sobre um observador é que ele implementa uma certa interface; Ele não precisa conhecer a classe concreta do observador. Podemos adicionar novos observadores a qualquer momento; Basta que eles implementem a interface observer e assinem um dado subject. Adicionar e remover novos observadores no subject podem acontecer sem mudanças no código, em tempo de execução.
17 Outras considerações Suporte para comunicação em broadcastO Subject faz broadcast do aviso. Os Observers podem fazer o que quiserem com o aviso, incluindo ignorá-lo Do lado negativo: o custo de uma mudança ao estado de um Source pode ser grande se houver muitos Listeners
18 Modelos de notificaçãoPush model: O Subject envia informações detalhadas das atualizações, e.g. através de argumentos Pull model: O Observer é notificado de que alguma mudança ocorreu e pega o que precisa do Subject através de getters Hey, observer, variables a, b, c and d just changed! Take all of them! subject observer Ambas são válidas, cabe ao programador definir o que mais lhe adequa. Eu, particularmente, gosto da segunda opção. Hey, observer, something just changed! Hmm.. This moment I‘m just interested in variable a! Gimme that! subject observer
19 Prática (push model e pull model)Você implementou a prática anterior (Editora e Pessoa) com qual estilo de notificação? Mude sua implementação para o outro modelo de notificação! (10 minutos)
20 Referências O capítulo 2 do livro “Padrões de Projeto – Use a Cabeça!”