Padrão Observer
O Padrão Observer
  Sua empresa acaba de ganhar
um novo contrato:
  Aplicação Web para monitoração
do tempo
Estação Meteorológica
Visão Geral
Estação
Meteorológica
Sensor de umidade
Sensor de
temperatura
Sensor de pressão
Objeto
D...
A classe DadosDoTempo
  Retorna as medições
mais recentes
  Este objeto sabe como
obter estas informações
/**
* Este mét...
A classe DadosDoTempo
  Tarefa:
  Implementar
medicoesAlteradas() de
modo que atualize as três
visões: condições
climáti...
Juntando as informações
  A classe DadosDoTempo possui métodos para
obter 3 medições diferentes:
  Temperatura
  Umidad...
Requisitos
  Precisamos implementar 3 elementos de
exibição que usem os dados meteorológicos
  Condições Atuais
  Estat...
Uma implementação
public void medicoesAlteradas() {
float temperatura = getTemperatura();
float umidade = getUmidade();
fl...
Uma implementação
public void medicoesAlteradas() {
float temperatura = getTemperatura();
float humidade = getHumidade();
...
Como funciona o padrão Observer?
  Como uma assinatura de revista ou jornal
  Uma editora publica uma revista
  Você as...
Da revista para o padrão
  Editora  Assunto (Subject)
  Assinantes  Observadores (Observers)
Padrão Observer
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
O Pato informa ao Objeto Assunto que
quer ser um observador
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores...
Agora o NovoLeitor é um
observador
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto...
O Assunto recebe um novo valor
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Ass...
O objeto Rato não quer mais ser um
observador
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLe...
Um leitor está fora
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
O Assunto recebe um novo valor
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Ass...
Segundo Padrão
OBSERVER
O Padrão Observer define a dependência
um-para-muitos entre objetos para que,
quando um objeto mud...
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Estado alterado
 Dependentes notificados...
Observer
O diagrama de classes
A dependência entre os participantes
  O Assunto é o objeto que contém o estado e que o
controla
  Existe apenas UM assu...
A dependência entre os participantes
  Os observadores usam este estado quando
necessário ainda que não pertença a eles
O...
A dependência entre os participantes
  Existem muitos observadores e eles
confiam no Assunto para contar-lhes quando ocor...
Fraco Acoplamento
  Objetos que interagem entre si
  Possuem pouco conhecimento sobre cada um
  Padrão Observer
  Forn...
Fraco Acoplamento no Observer
  A única coisa que o Assunto (Subject) sabe
sobre um Observador é que ele implementa
um de...
Fraco Acoplamento no Observer
  É possível adicionar um novo observador a
qualquer momento
Fraco Acoplamento no Observer
  Não precisamos modificar o Subject (Assunto)
para adicionar novos tipos de observadores
Fraco Acoplamento no Observer
  Podemos reusar os objetos
  Alterações feitas em cada um deles não afetarão o
outro
Princípio de Design
  Procure desenvolver designs fracamente
acoplados entre objetos
  Permite que construir sistemas OO...
Como aplicar?
Estação
Meteorológica
Objeto
DadosDoTempo
Telas
Projetando a
Estação Meteorológica
Implementação
public interface Subject {
void registrarObservador(Observer o);
void removerObservadores(Observer o);
void ...
Objetos DadosDoTempo
DadosDoTempo.java
import java.util.ArrayList;
public class DadosDoTempo implements Subject {
/**
* Esta lista guarda os ob...
DadosDoTempo.java
/**
* Registra o observador através da inclusão dele na lista
*/
public void registrarObservador(Observe...
DadosDoTempo.java
/**
* Método usado quando ocorrer alterações nas medidas do tempo
*
*/
public void medicoesAlteradas() {...
TelaCondicoesAtuais
TelaCondicoesAtuais.java
/**
* Esta classe implementa o Padrão Observer, mais especificamente o participante
* Observer.
*...
TelaCondicoesAtuais.java
/**
* Atualiza os valores de temperatura, umidade e pressao.
* Este método é chamado no Subject (...
Como seria o código para
as outras Telas?
  TelaPrevisao e TelaEstatisticas
Testando com uma mini estação
public class EstacaoMeteorologica {
public static void main(String[] args) {
DadosDoTempo da...
Princípios de Design no Observer
  Separar o que varia do que continua igual
  Variação: Estado do Subject
  Número de ...
Princípios de Design no Observer
  Programar para Interface e não para
implementação
  Tanto Subject como Observer usam ...
Princípios de Design no Observer
  Priorizar a composição
  O padrão usa a composição para compor qualquer
número de obs...
O que é
delegação?
Composição?
Upcoming SlideShare
Loading in...5
×

Observer - Padrões de projeto

730

Published on

Aula sobre o padrão de projeto Observer

Published in: Technology
1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total Views
730
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
33
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

Observer - Padrões de projeto

  1. 1. Padrão Observer
  2. 2. O Padrão Observer   Sua empresa acaba de ganhar um novo contrato:   Aplicação Web para monitoração do tempo
  3. 3. Estação Meteorológica Visão Geral Estação Meteorológica Sensor de umidade Sensor de temperatura Sensor de pressão Objeto DadosDoTempo Fornecido pelo Cliente O que devemos implementar
  4. 4. A classe DadosDoTempo   Retorna as medições mais recentes   Este objeto sabe como obter estas informações /** * Este método é executado * sempre que as medidas * meteorológicas forem alteradas * */ public void medicoesAlteradas() { //seu código aqui }
  5. 5. A classe DadosDoTempo   Tarefa:   Implementar medicoesAlteradas() de modo que atualize as três visões: condições climáticas atuais, status meteorológico e previsão
  6. 6. Juntando as informações   A classe DadosDoTempo possui métodos para obter 3 medições diferentes:   Temperatura   Umidade   Pressão   O método medicoesAlteradas é chamado sempre que dados de medição estão disponíveis (Não sabemos como esse método é chamado, apenas que ele é)
  7. 7. Requisitos   Precisamos implementar 3 elementos de exibição que usem os dados meteorológicos   Condições Atuais   Estatísticas   Previsão Tela 1 Tela 2
  8. 8. Uma implementação public void medicoesAlteradas() { float temperatura = getTemperatura(); float umidade = getUmidade(); float pressao = getPressao(); telaCondicoes.atualizar( temperatura, umidade, pressao); telaEstatisticas.atualizar( temperatura, umidade, pressao); telaPrevisao.atualizar(temperatura, umidade, pressao); }
  9. 9. Uma implementação public void medicoesAlteradas() { float temperatura = getTemperatura(); float humidade = getHumidade(); float pressao = getPressao(); telaCondicoes.atualizar( temperatura, humidade, pressao); telaEstatisticas.atualizar( temperatura, humidade, pressao); telaPrevisao.atualizar(temperatura, humidade, pressao); }
  10. 10. Como funciona o padrão Observer?   Como uma assinatura de revista ou jornal   Uma editora publica uma revista   Você assina a revista e sempre recebe novas edições   Enquanto assinante continua recebendo revistas   Você cancela a assinatura quando não quer mais receber as revistas   Enquanto a editora permanecer em um negócio, outras pessoas, empresas e companhias podem assinar e cancelar o recebimento da revista
  11. 11. Da revista para o padrão   Editora  Assunto (Subject)   Assinantes  Observadores (Observers)
  12. 12. Padrão Observer Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  13. 13. O Pato informa ao Objeto Assunto que quer ser um observador Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  14. 14. Agora o NovoLeitor é um observador Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  15. 15. O Assunto recebe um novo valor Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  16. 16. O objeto Rato não quer mais ser um observador Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor remova/cancele minha assinatura Objeto Assunto
  17. 17. Um leitor está fora Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  18. 18. O Assunto recebe um novo valor Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  19. 19. Segundo Padrão OBSERVER 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.
  20. 20. Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Estado alterado  Dependentes notificados Objeto Assunto
  21. 21. Observer O diagrama de classes
  22. 22. A dependência entre os participantes   O Assunto é o objeto que contém o estado e que o controla   Existe apenas UM assunto com estado Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  23. 23. A dependência entre os participantes   Os observadores usam este estado quando necessário ainda que não pertença a eles Objeto Leitor Objeto Leitor Objeto Leitor Objeto Leitor Objeto Assunto
  24. 24. A dependência entre os participantes   Existem muitos observadores e eles confiam no Assunto para contar-lhes quando ocorrer alterações no estado Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  25. 25. Fraco Acoplamento   Objetos que interagem entre si   Possuem pouco conhecimento sobre cada um   Padrão Observer   Fornece um design fracamente acoplado   Por quê?
  26. 26. Fraco Acoplamento no Observer   A única coisa que o Assunto (Subject) sabe sobre um Observador é que ele implementa um determinada interface
  27. 27. Fraco Acoplamento no Observer   É possível adicionar um novo observador a qualquer momento
  28. 28. Fraco Acoplamento no Observer   Não precisamos modificar o Subject (Assunto) para adicionar novos tipos de observadores
  29. 29. Fraco Acoplamento no Observer   Podemos reusar os objetos   Alterações feitas em cada um deles não afetarão o outro
  30. 30. Princípio de Design   Procure desenvolver designs fracamente acoplados entre objetos   Permite que construir sistemas OO flexíveis   Com possibilidade de sucesso nas mudanças   Porque ele minimizam a interdependência entre objetos
  31. 31. Como aplicar? Estação Meteorológica Objeto DadosDoTempo Telas
  32. 32. Projetando a Estação Meteorológica
  33. 33. Implementação public interface Subject { void registrarObservador(Observer o); void removerObservadores(Observer o); void notificarObservadores(); } public interface Observer { public void atualizar( float temperatura, float humidade, float pressao); } public interface ExibirElemento { public void exibir(); }
  34. 34. Objetos DadosDoTempo
  35. 35. DadosDoTempo.java import java.util.ArrayList; public class DadosDoTempo implements Subject { /** * Esta lista guarda os observadores */ public ArrayList<Observer> observadores; /** * Temperatura em graus celsius */ public float temperatura; /** * Umidade em percentuais */ public float umidade; /** * Pressao em joules */ public float pressao; /** * Construtor Inicializa a lista de observadores */ public DadosDoTempo() { observadores = new ArrayList<Observer>(); }
  36. 36. DadosDoTempo.java /** * Registra o observador através da inclusão dele na lista */ public void registrarObservador(Observer o) { observadores.add(o); } /** * Quando um observador não desejar mais recever notificações, usamos este * método para removê-lo da lista de observadores */ public void removerObservadores(Observer o) { int i = observadores.indexOf(o); if (i >= 0) { observadores.remove(i); } } /** * Notifica os observadores que uma mudança ocorreu */ public void notificarObservadores() { for (int i = 0; i < observadores.size(); i++) { Observer observador = (Observer) observadores.get(i); observador.atualizar(temperatura, umidade, pressao); } }
  37. 37. DadosDoTempo.java /** * Método usado quando ocorrer alterações nas medidas do tempo * */ public void medicoesAlteradas() { notificarObservadores(); } /** * Método que será usado pela Estacao Meteorológica para alterar * o estado da temperatura, da umidade e da pressao * @param temperatura Valor em graus Celsius * @param umidade Valor em percentuais * @param pressao Valor em joules */ public void setMedicoes(float temperatura, float umidade, float pressao) { this.temperatura = temperatura; this.humidade = umidade; this.pressao = pressao; medicoesAlteradas(); } }
  38. 38. TelaCondicoesAtuais
  39. 39. TelaCondicoesAtuais.java /** * Esta classe implementa o Padrão Observer, mais especificamente o participante * Observer. * @author eduardo * */ public class TelaCondicoesAtuais implements Observer, ExibirElemento { /** * Temperatura em graus celsius */ private float temperatura; /** * umidade em percentuais */ private float umidade; /** * Este é objeto Subject ao qual este Observer estará dependente */ private Subject dadosDoTempos; /** * Construtor que inicializa o Subject e registra este Observador junto * ao Subject * @param dadosDoTempos Subject ao qual este observador está ligado */ public TelaCondicoesAtuais(Subject dadosDoTempos) { this.dadosDoTempos = dadosDoTempos; this.dadosDoTempos.registrarObservador(this); }
  40. 40. TelaCondicoesAtuais.java /** * Atualiza os valores de temperatura, umidade e pressao. * Este método é chamado no Subject (DadosDoTempo.java) * Após a atualização de valores o método exibir() é chamado */ public void atualizar(float temperatura, float umidade, float pressao) { this.temperatura = temperatura; this.umidade = umidade; exibir(); } /** * <p>Este método é chamado sempre que o Observador receber novos valores * do Subject.</p> */ public void exibir() { System.out.println("n======== TELA CONDIÇÕES ATUAIS ========="); System.out.println("Condições atuais: " + temperatura + "ºC e " + umidade + "% de umidade"); } }
  41. 41. Como seria o código para as outras Telas?   TelaPrevisao e TelaEstatisticas
  42. 42. Testando com uma mini estação public class EstacaoMeteorologica { public static void main(String[] args) { DadosDoTempo dadosDoTempo = new DadosDoTempo(); TelaCondicoesAtuais telaCondicoesAtuais = new TelaCondicoesAtuais(dadosDoTempo); TelaEstatisticas telaEstatisticas = new TelaEstatisticas(dadosDoTempo); TelaPrevisao telaPrevisao = new TelaPrevisao(dadosDoTempo); dadosDoTempo.setMedicoes(30, 65, 30.4F); dadosDoTempo.setMedicoes(34, 70, 29.2F); dadosDoTempo.setMedicoes(28, 98, 29.2F); } }
  43. 43. Princípios de Design no Observer   Separar o que varia do que continua igual   Variação: Estado do Subject   Número de Observadores   Com o Observer você pode variar os objetos que dependem do estado de Subject, sem ter que mudá-lo.
  44. 44. Princípios de Design no Observer   Programar para Interface e não para implementação   Tanto Subject como Observer usam interfaces.   O Subject contém uma lista de objetos que implementam a interface Observer, enquanto os os objservadores registram-se ao Subject e são alterados por esta interface.   Design de fraco acoplamento
  45. 45. Princípios de Design no Observer   Priorizar a composição   O padrão usa a composição para compor qualquer número de observadores com seus Subjects.   Esta relação não é configurada por nenhuma hierarquia de herança.   Relações configuradas em tempo de execução
  46. 46. O que é delegação? Composição?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×