padrões de projeto aula 4 – padrão observer. padrÃo observer como manter objetos atualizados...
TRANSCRIPT
Padrões de ProjetoAula 4 – Padrão Observer
Padr
ões d
e Pr
ojet
o - O
bser
ver
PADRÃO OBSERVER
Como manter objetos atualizados quando algo importante ocorre?
2
Como permitir que os objetos decidam se querem
ser informados das mudanças em tempo de
execução?
Padr
ões d
e Pr
ojet
o - O
bser
ver
Como assinaturas de jornais e revistas funcionam?1. Uma editora começa a publicar jornais;2. Você assina o jornal de uma editora;3. Até aqui tudo bem... você ainda é um assinante, então você
continua recebendo os jornais diariamente;4. Você recebe a seguinte notícia:
5. Você cancela a assinatura;6. Os jornais param de ser entregues a você.
3Massss... 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
Padr
ões d
e Pr
ojet
o - O
bser
ver
Como o padrão Observer funciona?
4
Objeto Subject
Objetos de Observer
P1
P2
P3
P4
Padr
ões d
e Pr
ojet
o - O
bser
ver
Como o padrão Observer funciona?
5
Objeto Subject
Objetos de Observer
P1
P2
P3
P4
“Me registre, quero assinar”
Padr
ões d
e Pr
ojet
o - O
bser
ver
Como o padrão Observer funciona?
6
Objeto Subject
Objetos de Observer
P1
P2
P3
P4
Padr
ões d
e Pr
ojet
o - O
bser
ver
Como o padrão Observer funciona?
7
Objeto Subject
Objetos de Observer
P1
P2
P3
P4
“Cancele minha assinatura”
Padr
ões d
e Pr
ojet
o - O
bser
ver
Como o padrão Observer funciona?
8
Objeto Subject
Objetos de Observer
P2
P3
P4
P1
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.
Padr
ões d
e Pr
ojet
o - O
bser
ver
O diagrama de classes do padrão Observer• Pensemos no exemplo da Revistas e Assinantes
9
Padr
ões d
e Pr
ojet
o - O
bser
ver
10
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 Magazine e uma classe Person. Obviamente, Magazine é o nosso subject e Person o nosso observer.
• Crie um programa que permita uma Magazine 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.
Padr
ões d
e Pr
ojet
o - O
bser
ver
11
Padr
ões d
e Pr
ojet
o - O
bser
ver
Editoras e Assinantes• Mostrar implementação
12
Padr
ões d
e Pr
ojet
o - O
bser
ver
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.
1. A única coisa que um Subject sabe sobre um observador é que ele implementa uma certa interface;
2. Podemos adicionar novos Observers a qualquer momento;3. Nunca precisamos modificar o Subject para adicionar novos
tipos de Observers;4. 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.
13
Padr
ões d
e Pr
ojet
o - O
bser
ver
Modelos de notificação• Push 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
14
subject observer
Hey, observer, variables a, b, c and
d just changed! Take all of them!
subject observer
Hey, observer, something just changed!
Hmm.. This moment I‘m just interested in variable
a! Gimme that!
Padr
ões d
e Pr
ojet
o - O
bser
ver
Prática• Agora nós vamos implementar o sistema de exibição de vôos que é utilizado nos tótens
do aeroporto de João Pessoa.• Uma das classes do sistema, fornecida pelo aeroporto Castro Pinto, é a classe
FlightDataCollection e FlightData. FlightData tem os seguintes atributos: nº do vôo, empresa, horário, e um atributo que indique se o vôo está partindo ou chegando no aeroporto. FlightDataCollection tem um conjunto de FlightData.
• Todos os tótens devem ser atualizados em tempo real na medida em que FlightDataCollection seja atualizado com novos vôos, ou quando algum vôo tiver suas informações atualizadas.
• A solução deve ser expansível, isto é, outros desenvolvedores podem implementar novas configurações de display para outros tótens.
• Inicialmente o aeroporto precisa de dois tótens: 1. O primeiro tóten deve ficar na sala de embarque, e deve conter os horários de vôos que
irão decolar, assim os passageiros se mantém atualizados de possíveis atrasos;2. O segundo tóten deve ficar na sala de espera do desembarque, e deve conter os horários
de vôos que irão aterrissar, assim as pessoas que forem buscar alguém no aeroporto também possa saber de possíveis atrasos.
Pra que o resultado fique mais interessante seria legal que os painéis fossem mostrados em uma GUI.
15
Padr
ões d
e Pr
ojet
o - O
bser
ver
Prática• A solução deve ser expansível, isto é, outros desenvolvedores
podem implementar novas configurações de display para outros tótens.
• Será que sua implementação ficou expansível?• Agora implemente um terceiro tipo de tóten que contém horários
de embarque e desembarque.
16
Padr
ões d
e Pr
ojet
o - O
bser
ver
Referências• O capítulo 2 do livro “Padrões de Projeto – Use a Cabeça!”
17