observer - padrões de projeto
DESCRIPTION
Aula sobre o padrão de projeto ObserverTRANSCRIPT
![Page 1: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/1.jpg)
Padrão Observer
![Page 2: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/2.jpg)
O Padrão Observer Sua empresa acaba de ganhar
um novo contrato:
Aplicação Web para monitoração do tempo
![Page 3: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/3.jpg)
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
![Page 4: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/4.jpg)
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 }
![Page 5: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/5.jpg)
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
![Page 6: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/6.jpg)
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 é)
![Page 7: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/7.jpg)
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
![Page 8: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/8.jpg)
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); }
![Page 9: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/9.jpg)
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); }
![Page 10: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/10.jpg)
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
![Page 11: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/11.jpg)
Da revista para o padrão Editora Assunto (Subject)
Assinantes Observadores (Observers)
![Page 12: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/12.jpg)
Padrão Observer
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
![Page 13: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/13.jpg)
O Pato informa ao Objeto Assunto que quer ser um observador
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
![Page 14: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/14.jpg)
Agora o NovoLeitor é um observador
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
![Page 15: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/15.jpg)
O Assunto recebe um novo valor
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
![Page 16: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/16.jpg)
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
![Page 17: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/17.jpg)
Um leitor está fora
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
![Page 18: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/18.jpg)
O Assunto recebe um novo valor
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
![Page 19: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/19.jpg)
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.
![Page 20: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/20.jpg)
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores Objeto NovoLeitor
Estado alterado Dependentes notificados
Objeto Assunto
![Page 21: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/21.jpg)
Observer O diagrama de classes
![Page 22: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/22.jpg)
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
![Page 23: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/23.jpg)
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
Objetos observadores
Objeto Leitor
Objeto Assunto
![Page 24: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/24.jpg)
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
![Page 25: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/25.jpg)
Fraco Acoplamento Objetos que interagem entre si
Possuem pouco conhecimento sobre cada um
Padrão Observer Fornece um design fracamente acoplado Por quê?
![Page 26: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/26.jpg)
Fraco Acoplamento no Observer A única coisa que o Assunto (Subject) sabe
sobre um Observador é que ele implementa um determinada interface
![Page 27: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/27.jpg)
Fraco Acoplamento no Observer É possível adicionar um novo observador a
qualquer momento
![Page 28: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/28.jpg)
Fraco Acoplamento no Observer Não precisamos modificar o Subject (Assunto)
para adicionar novos tipos de observadores
![Page 29: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/29.jpg)
Fraco Acoplamento no Observer Podemos reusar os objetos Alterações feitas em cada um deles não afetarão o
outro
![Page 30: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/30.jpg)
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
![Page 31: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/31.jpg)
Como aplicar?
Estação Meteorológica
Objeto DadosDoTempo
Telas
![Page 32: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/32.jpg)
Projetando a Estação Meteorológica
![Page 33: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/33.jpg)
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(); }
![Page 34: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/34.jpg)
Objetos DadosDoTempo
![Page 35: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/35.jpg)
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>(); }
![Page 36: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/36.jpg)
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); } }
![Page 37: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/37.jpg)
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(); } }
![Page 38: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/38.jpg)
TelaCondicoesAtuais
![Page 39: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/39.jpg)
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); }
![Page 40: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/40.jpg)
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"); } }
![Page 41: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/41.jpg)
Como seria o código para as outras Telas?
TelaPrevisao e TelaEstatisticas
![Page 42: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/42.jpg)
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); } }
![Page 43: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/43.jpg)
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.
![Page 44: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/44.jpg)
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
![Page 45: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/45.jpg)
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
![Page 46: Observer - Padrões de projeto](https://reader036.vdocuments.site/reader036/viewer/2022062405/55834c13d8b42a882e8b519b/html5/thumbnails/46.jpg)
O que é delegação?
Composição?