SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
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
DadosDoTempo
Fornecido pelo Cliente O que devemos implementar
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
}
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
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 é)
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
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);
}
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);
}
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
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
Objeto NovoLeitor
Objeto Assunto
Agora o NovoLeitor é um
observador
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 Assunto
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
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 Assunto
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.
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Estado alterado
 Dependentes notificados
Objeto Assunto
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 assunto
com estado
Objeto Leitor
Objeto Leitor
Objeto Leitor
Objetos observadores
Objeto NovoLeitor
Objeto Assunto
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
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
Fraco Acoplamento
  Objetos que interagem entre si
  Possuem pouco conhecimento sobre cada um
  Padrão Observer
  Fornece um design fracamente acoplado
  Por quê?
Fraco Acoplamento no Observer
  A única coisa que o Assunto (Subject) sabe
sobre um Observador é que ele implementa
um determinada interface
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 flexíveis
  Com possibilidade de sucesso nas mudanças
  Porque ele minimizam a interdependência entre
objetos
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 notificarObservadores();
}
public interface Observer {
public void atualizar(
float temperatura, float humidade, float pressao);
}
public interface ExibirElemento {
public void exibir();
}
Objetos DadosDoTempo
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>();
}
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);
}
}
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();
}
}
TelaCondicoesAtuais
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);
}
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");
}
}
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 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);
}
}
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.
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
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
O que é
delegação?
Composição?

Más contenido relacionado

La actualidad más candente

Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...
Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...
Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...Pristiadi Utomo
 
Ujian Komprehensif PPG 2022.pptx
Ujian Komprehensif PPG 2022.pptxUjian Komprehensif PPG 2022.pptx
Ujian Komprehensif PPG 2022.pptxnurazulfia1
 
PENELITIAN TINDAKAN KELAS IPA SMP
PENELITIAN TINDAKAN KELAS IPA SMPPENELITIAN TINDAKAN KELAS IPA SMP
PENELITIAN TINDAKAN KELAS IPA SMPArif Sulistiawan
 
Perangkat ipa k13 kelas 9 sem2 TP 20 21
Perangkat ipa k13 kelas 9 sem2 TP 20 21Perangkat ipa k13 kelas 9 sem2 TP 20 21
Perangkat ipa k13 kelas 9 sem2 TP 20 21sajidintuban
 
Modul Ajar Bagian DINAMIKA.docx
Modul Ajar Bagian DINAMIKA.docxModul Ajar Bagian DINAMIKA.docx
Modul Ajar Bagian DINAMIKA.docxSunariyoSunariyo1
 
MINGGU EFEKTIF KLS X.docx
MINGGU EFEKTIF KLS X.docxMINGGU EFEKTIF KLS X.docx
MINGGU EFEKTIF KLS X.docxDarmiatimimi1
 
lkpd elastisitas.docx
lkpd elastisitas.docxlkpd elastisitas.docx
lkpd elastisitas.docxFerdyNovrizal
 
Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...
Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...
Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...ZainulHasan13
 
Tes Formatif Usaha & Pesawat Sederhana
Tes Formatif Usaha & Pesawat SederhanaTes Formatif Usaha & Pesawat Sederhana
Tes Formatif Usaha & Pesawat SederhanaSMPN 3 TAMAN SIDOARJO
 
Soal Latihan Jangka Sorong dan Mikrometer sekrup .pdf
Soal Latihan Jangka Sorong dan Mikrometer sekrup .pdfSoal Latihan Jangka Sorong dan Mikrometer sekrup .pdf
Soal Latihan Jangka Sorong dan Mikrometer sekrup .pdfZainulHasan13
 
ATP Matematika x SMA.pdf
ATP Matematika x SMA.pdfATP Matematika x SMA.pdf
ATP Matematika x SMA.pdfMeldaElisa2
 
Lembar kerja siswa archimedes
Lembar kerja siswa archimedesLembar kerja siswa archimedes
Lembar kerja siswa archimedesIra Putri Jambak
 
02. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 1
02. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 102. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 1
02. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 1badri rahmatulloh
 

La actualidad más candente (20)

Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...
Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...
Materi fisika kesehatan kurikulum 2013 smk kelas x dan xi (pristiadi utomo 05...
 
Ujian Komprehensif PPG 2022.pptx
Ujian Komprehensif PPG 2022.pptxUjian Komprehensif PPG 2022.pptx
Ujian Komprehensif PPG 2022.pptx
 
Kunci LKPD Hukum Archimedes
Kunci LKPD Hukum ArchimedesKunci LKPD Hukum Archimedes
Kunci LKPD Hukum Archimedes
 
Lks pengukuran
Lks pengukuranLks pengukuran
Lks pengukuran
 
PENELITIAN TINDAKAN KELAS IPA SMP
PENELITIAN TINDAKAN KELAS IPA SMPPENELITIAN TINDAKAN KELAS IPA SMP
PENELITIAN TINDAKAN KELAS IPA SMP
 
Perangkat ipa k13 kelas 9 sem2 TP 20 21
Perangkat ipa k13 kelas 9 sem2 TP 20 21Perangkat ipa k13 kelas 9 sem2 TP 20 21
Perangkat ipa k13 kelas 9 sem2 TP 20 21
 
Modul Ajar Bagian DINAMIKA.docx
Modul Ajar Bagian DINAMIKA.docxModul Ajar Bagian DINAMIKA.docx
Modul Ajar Bagian DINAMIKA.docx
 
LKPD Soal
LKPD SoalLKPD Soal
LKPD Soal
 
MINGGU EFEKTIF KLS X.docx
MINGGU EFEKTIF KLS X.docxMINGGU EFEKTIF KLS X.docx
MINGGU EFEKTIF KLS X.docx
 
1. rpp pengukuran
1. rpp pengukuran1. rpp pengukuran
1. rpp pengukuran
 
Meniskus ok
Meniskus okMeniskus ok
Meniskus ok
 
lkpd elastisitas.docx
lkpd elastisitas.docxlkpd elastisitas.docx
lkpd elastisitas.docx
 
Dinamika hukum newton soal dan pembahasannya
Dinamika hukum newton soal dan pembahasannyaDinamika hukum newton soal dan pembahasannya
Dinamika hukum newton soal dan pembahasannya
 
Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...
Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...
Bab 1.2. IPA Kelas 7 (Laboratorium IPA) Kurikulum Merdeka SMP Ibrahimy 1 Suko...
 
Tes Formatif Usaha & Pesawat Sederhana
Tes Formatif Usaha & Pesawat SederhanaTes Formatif Usaha & Pesawat Sederhana
Tes Formatif Usaha & Pesawat Sederhana
 
Soal Latihan Jangka Sorong dan Mikrometer sekrup .pdf
Soal Latihan Jangka Sorong dan Mikrometer sekrup .pdfSoal Latihan Jangka Sorong dan Mikrometer sekrup .pdf
Soal Latihan Jangka Sorong dan Mikrometer sekrup .pdf
 
ATP Matematika x SMA.pdf
ATP Matematika x SMA.pdfATP Matematika x SMA.pdf
ATP Matematika x SMA.pdf
 
Lembar kerja siswa archimedes
Lembar kerja siswa archimedesLembar kerja siswa archimedes
Lembar kerja siswa archimedes
 
Hukum Kirchoff
Hukum KirchoffHukum Kirchoff
Hukum Kirchoff
 
02. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 1
02. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 102. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 1
02. RPP FISIKA KD. 3.2 MATERI PENGUKURAN KELAS X SEMESTER 1
 

Destacado

Padrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e StrategyPadrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e StrategyJoão Carlos Ottobboni
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Javaalexmacedo
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de ProjetoEduardo Mendes
 
33 design patterns com Java
33 design patterns com Java33 design patterns com Java
33 design patterns com JavaGlobalcode
 
Introducao - Engenharia de Software
Introducao - Engenharia de SoftwareIntroducao - Engenharia de Software
Introducao - Engenharia de SoftwareEduardo Mendes
 
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetG gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetMessias Castro
 
Montando sites com XHTML e CSS utilizando os padrões web
Montando sites com XHTML e CSS utilizando os padrões webMontando sites com XHTML e CSS utilizando os padrões web
Montando sites com XHTML e CSS utilizando os padrões webigorpimentel
 
Evolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEvolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEduardo Mendes
 
Aplicação de Padrões de Projeto para a melhoria da manutenabilidade de software
Aplicação de Padrões de Projeto para a melhoria da manutenabilidade de softwareAplicação de Padrões de Projeto para a melhoria da manutenabilidade de software
Aplicação de Padrões de Projeto para a melhoria da manutenabilidade de softwareCesar Rocha
 
Publish-Subscribe Middlewares
Publish-Subscribe MiddlewaresPublish-Subscribe Middlewares
Publish-Subscribe Middlewareshome
 
5507 os principais design patterns
5507   os principais design patterns5507   os principais design patterns
5507 os principais design patternsAndre Baltieri
 
Padrões de Projeto - Observer
Padrões de Projeto - ObserverPadrões de Projeto - Observer
Padrões de Projeto - ObserverJuliana Cindra
 
Padrão Observer (Java)
Padrão Observer (Java)Padrão Observer (Java)
Padrão Observer (Java)Allan Denis
 

Destacado (20)

Padrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e StrategyPadrões de Projeto - Observer e Strategy
Padrões de Projeto - Observer e Strategy
 
Exemplos de Design Patterns em Java
Exemplos de Design Patterns em JavaExemplos de Design Patterns em Java
Exemplos de Design Patterns em Java
 
Design Patterns - Com Java
Design Patterns  - Com JavaDesign Patterns  - Com Java
Design Patterns - Com Java
 
Strategy - Padrões de Projeto
Strategy - Padrões de ProjetoStrategy - Padrões de Projeto
Strategy - Padrões de Projeto
 
33 design patterns com Java
33 design patterns com Java33 design patterns com Java
33 design patterns com Java
 
Design patterns de uma vez por todas
Design patterns de uma vez por todasDesign patterns de uma vez por todas
Design patterns de uma vez por todas
 
design patterns java
design patterns javadesign patterns java
design patterns java
 
Padrões de Projeto - Design Patterns
Padrões de Projeto - Design PatternsPadrões de Projeto - Design Patterns
Padrões de Projeto - Design Patterns
 
Introducao - Engenharia de Software
Introducao - Engenharia de SoftwareIntroducao - Engenharia de Software
Introducao - Engenharia de Software
 
Html - Aula 3
Html - Aula 3Html - Aula 3
Html - Aula 3
 
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetG gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
 
# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1
 
Montando sites com XHTML e CSS utilizando os padrões web
Montando sites com XHTML e CSS utilizando os padrões webMontando sites com XHTML e CSS utilizando os padrões web
Montando sites com XHTML e CSS utilizando os padrões web
 
Evolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEvolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de Software
 
Aplicação de Padrões de Projeto para a melhoria da manutenabilidade de software
Aplicação de Padrões de Projeto para a melhoria da manutenabilidade de softwareAplicação de Padrões de Projeto para a melhoria da manutenabilidade de software
Aplicação de Padrões de Projeto para a melhoria da manutenabilidade de software
 
Apostila `profissional cftv
Apostila `profissional cftvApostila `profissional cftv
Apostila `profissional cftv
 
Publish-Subscribe Middlewares
Publish-Subscribe MiddlewaresPublish-Subscribe Middlewares
Publish-Subscribe Middlewares
 
5507 os principais design patterns
5507   os principais design patterns5507   os principais design patterns
5507 os principais design patterns
 
Padrões de Projeto - Observer
Padrões de Projeto - ObserverPadrões de Projeto - Observer
Padrões de Projeto - Observer
 
Padrão Observer (Java)
Padrão Observer (Java)Padrão Observer (Java)
Padrão Observer (Java)
 

Más de Eduardo Mendes

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosEduardo Mendes
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - FundamentosEduardo Mendes
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de ProjetoEduardo Mendes
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTMLEduardo Mendes
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEduardo Mendes
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails Eduardo Mendes
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Eduardo Mendes
 

Más de Eduardo Mendes (20)

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
AngularJS - Rotas
AngularJS - RotasAngularJS - Rotas
AngularJS - Rotas
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - Fundamentos
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
 
ExtJS-4
ExtJS-4ExtJS-4
ExtJS-4
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Jquery
JqueryJquery
Jquery
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de Software
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 

Monitoramento meteorológico com Padrão Observer

  • 2. O Padrão Observer   Sua empresa acaba de ganhar um novo contrato:   Aplicação Web para monitoração do tempo
  • 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. 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. 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. 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. 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. 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. 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. 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. Da revista para o padrão   Editora  Assunto (Subject)   Assinantes  Observadores (Observers)
  • 12. Padrão Observer Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  • 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. Agora o NovoLeitor é um observador Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  • 15. O Assunto recebe um novo valor Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  • 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. Um leitor está fora Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  • 18. O Assunto recebe um novo valor Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Objeto Assunto
  • 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. Objeto Leitor Objeto Leitor Objeto Leitor Objetos observadores Objeto NovoLeitor Estado alterado  Dependentes notificados Objeto Assunto
  • 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. 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. 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. Fraco Acoplamento   Objetos que interagem entre si   Possuem pouco conhecimento sobre cada um   Padrão Observer   Fornece um design fracamente acoplado   Por quê?
  • 26. Fraco Acoplamento no Observer   A única coisa que o Assunto (Subject) sabe sobre um Observador é que ele implementa um determinada interface
  • 27. Fraco Acoplamento no Observer   É possível adicionar um novo observador a qualquer momento
  • 28. Fraco Acoplamento no Observer   Não precisamos modificar o Subject (Assunto) para adicionar novos tipos de observadores
  • 29. Fraco Acoplamento no Observer   Podemos reusar os objetos   Alterações feitas em cada um deles não afetarão o outro
  • 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
  • 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(); }
  • 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. 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. 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(); } }
  • 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. 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. Como seria o código para as outras Telas?   TelaPrevisao e TelaEstatisticas
  • 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. 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. 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. 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