// quando o estado do Sujeito muda

Documentos relacionados
// quando o estado do Sujeito muda

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Prof. Msc. Vladimir Camelo

Tipos, Literais, Operadores

Tipos, Literais, Operadores

ESTUDO DO PADRÃO DE PROJETO OBSERVER NO DESENVOLVIMENTO DE SOFTWARES UTILIZANDO A ARQUITETURA MVC RESUMO

Especificam quem tem acesso a cada entidade, isto é, quem tem acesso a. cada classe e cada membro da classe (dados e métodos)

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

Collections Framework

Orientação a Objetos AULA 09

Utilizando Threads em Java

Computação Paralela. Conceitos de Programação Orientada ao Objecto. João Luís Ferreira Sobral Departamento do Informática Universidade do Minho

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Palavras Reservadas da Linguagem Java

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

No final deste curso, saberás criar programas através da linguagem de programação Java.

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Threads. O que é uma Thread? Paralelismo

Arquitecturas Paralelas I Computação Paralela em Larga Escala. Conceitos de Programação Orientada ao Objecto

Linguagem de Programação II Implementação

POO29004 Programação Orientada a Objetos

Padrões de Projeto. Intenção: Observer. Motivação: Motivação:

Programação Java Aula 04

Threads em Java. Java Threads. Java Componentes: JVM JVM:

Observer. Edeyson Andrade Gomes

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

LEIC-T LERC MEIC-T 2011/2012 1º Semestre Programação com Objetos 2012/01/07 11h00m 3/10

Programação Orientada a Objetos. Encapsulamento

Programação Orientada a Objetos

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Num programa em JAVA é possível definir diferentes sequências de execução independente: Threads.

Programação concorrente em Java

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

Observer. Problema. Objetivo

Segunda Parte (3 valores) Primeira Parte (7 valores) Nome: Número: PERGUNTA NOTA PERGUNTA RESPOSTA

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Polimorfismo. O que é polimorfismo?

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

Instituto Federal de Educação, Ciência e Tecnologia da Bahia Campus Irecê Disciplina: Linguagem Técnica II Prof o Jonatas Bastos

Profa. Thienne Johnson EACH/USP

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Sistema Futebol - Java

Programação Estruturada e Orientada a Objetos

Multithreading. Programação Orientada por Objectos com Java. Ademar Aguiar. MRSC - Programação em Comunicações

Programação com Objectos 2º Teste Tipo 1º Semestre (120 minutos)

Instituto Superior de Engenharia de Lisboa

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

Classe Abstrata e Interface

Nome: Número: Primeira Parte (7 valores) Segunda Parte (3 valores)

Diagrama de Classes. Conceitos Básicos. prof. Robinson Vida Monday, April 20, 15

Universidade da Beira Interior. Sistemas Distribuídos. Folha 4-1. Threads Daemon Threads

Interfaces POO. Prof. Marcio Delamaro

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

2 Vectores de objectos

Programação de Computadores II TCC /Turma A 1

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

A classe ArrayList. IFSC/Florianópolis - Programação Orientada a Objetos com Java - prof. Herval Daminelli

Segunda Parte (3 valores) Primeira Parte (7 valores) Nome: Número: PERGUNTA NOTA PERGUNTA RESPOSTA

9 Classes Abstractas e Interfaces

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

Computação II - Java - Teste 1.2 Prof. Adriano Joaquim de Oliveira Cruz 2015/04/27

Programação orientada a objetos em Java

Módulo 03. Identificadores, Palavras Reservadas, e Tipos

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

Programação com Objectos. 2º Teste 2015/2016 1º Semestre

JAVA COLLECTIONS API: LISTAS

Java para Desktop. Programação Orientada à Objetos 2 JSE

Vetores Unimensionais

Orientação a Objetos - Herança

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

1. Por que não utilizar a notação de composição da UML para mostrar que um cachorro é composto de altura, peso, cor e data de nascimento?

Só podem ser executados por uma Thread que detenha o lock do objecto

Análise e Projeto Orientados por Objetos

Programação Java (nível intermediário) 4. Polimorfismo

MsC. João Maria MsC. Liviane Melo

RESPOSTA: import java.util.arraylist; import java.util.list; class CarrinhoDeCompras2 { List<Produto> produtos;

PROGRAMAÇÃO JAVA. Parte 3

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Introdução. LP OO desenvolvida pela Sun no início da década de 90 com sintaxe semelhente a C\C++. C C++.

Análise de Programação

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Notas de Aula 07: vetores de objetos e coleções

Universidade da Beira Interior. Sistemas Distribuídos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Vítor E. Silva Souza

Programação Concorrente com Thread Java. Luiz Affonso Guedes Sistemas Distribuidos

Transcrição:

Padrão Observer No padrão Observer temos dois objectos: um, designado Sujeito (Subject) que possui uma dada informação que pode variar ao longo da execução do programa, e outro, designado Observador (Observer) que está interessado em ser notificado sempre que essa informação varie. O padrão Observer diz-nos como estruturar as classes e objectos de modo a que o Sujeito e o Observador tenham baixo acoplamento, minimizando a interdependência entre estes dois objetos. Os objectos Observadores registam-se (subscrevem ) no objecto Sujeito para receberem actualizações quando os dados do objecto Sujeito mudarem. Quando os dados no objecto Sujeito mudam, os observadores são notificados. O padrão Observer define uma relação de dependência entre o sujeito e os observadores, de um-para-muitos, tal que quando um objecto (sujeito) muda de estado, todos os seus dependentes (observadores) são notificados e actualizados automaticamente. A relação é entre um sujeito e muitos observadores. interface IObservavel: public interface IObservavel { void registarobservador(iobservador o); void removerobservador(iobservador o); void notificarobservadores(); // regista um IObservador // remove um IObservador // notifica todos os Observadores // quando o estado do Sujeito muda classe Sujeito: import java.util.arraylist; public class Sujeito implements IObservavel { private ArrayList observadores = new ArrayList(); //dados que podem variar; // regista um IObservador public void registarobservador(iobservador o) { observadores.add(o); // remove um IObservador public void removerobservador(iobservador o) { int i = observadores.indexof(o); if (i>=0) observadores.remove(i); // notifica todos os Observadores quando o estado do Sujeito muda public void notificarobservadores() { for (int i = 0; i < observadores.size(); i++) { IObservador observador = (IObservador) observadores.get(i); observador.actualizar(temperatura); // simula ocorrencia de variacoes dos dados public void iniciarvariacaotemperatura() { while (true) { try { Thread.sleep(5000); catch (InterruptedException e) { int variacao = 1 + (int) (5 * Math.random()); int sinalvariacao = (Math.random() < 0.5)? -1 : 1; variacao = sinalvariacao * variacao; mudatemperatura(variacao);

private void mudatemperatura(int variacao) { this.temperatura += variacao; notificarobservadores(); interface IObservador: public interface IObservador { void actualizar(int temperatura); classe Observador1: public class Observador1 implements IObservador { public void actualizar(int temperatura) { this.temperatura = temperatura; System.out.println("Observador1: temperatuta actual= " + temperatura); classe Observador2: public class Observador2 implements IObservador { public void actualizar(int temperatura) { this.temperatura = temperatura; System.out.println("Observador2: temperatuta actual= " + temperatura); classe Main: public class Main { public static void main(string[] args) { Sujeito sujeito = new Sujeito(); IObservavel suj = sujeito; IObservador obs1 = new Observador1(); IObservador obs2 = new Observador2(); suj.registarobservador(obs1); suj.registarobservador(obs2); sujeito.iniciavariacaotemperatura(); A classe do objeto Sujeito não conhece os objetos Observadores concretos que notifica. Apenas sabe que implementam a interface IObservador, o que lhe permite conhecer uma interface comum a todos os observadores para lhes comunicar alterações no seu estado. O objeto sujeito apenas depende de uma lista de objetos que implementam a interface IObservador. Em qualquer altura (mesmo em runtime) podemos adicionar ou remover observadores.

Não é necessário modificar a classe do objeto Sujeito para adicionar ou remover observadores. A classe do objeto Sujeito implementa a interface IObservavel, o que garante que o objecto Sujeito pode registar observadores, remover observadores e notificar observadores. Para registar ou remover um observador num objeto Sujeito usase a interface IObservador. Deste modo um objeto Sujeito, sempre que o seu estado muda, notifica um objeto observador, mas apenas existe um fraco acoplamento entre estes dois objetos. As classes dos objetos Observadores também não conhecem o objeto Sujeito. No padrão Observer os objectos sujeito e observadores estão fracamente acoplados, isto é, podem interatuar mas têm pouco conhecimento uns dos outros. Mudanças quer na classe Sujeito quer numa classe Observador não afetarão a outra, desde que estas classes implementem as respectivas interfaces. O baixo acoplamento entre estas duas classes permite-nos fazer mudanças em qualquer uma, desde que os objectos Sujeito e Observador cumpram o contrato especificado nas respetivas interfaces. Padrão Observer da API do Java A linguagem Java tem suporte para o padrão Observer incorporado no package java.util: classe Observable (semelhante ao interface IObservavel), e interface Observer (semelhante ao interface IObservador). Observable é uma classe e não uma interface, portanto a classe Sujeito deve estender a superclasse java.util.observable. A classe Observable da API do Java já implementa todos os métodos necessários pra fornecer o comportamento observador/observável. A classe Sujeito a criar, subclasse de Observable, só necessita de aceder ao estado interno do objecto Observável, para sinalizar que o estado mudou (setchanged) e enviar notificação para todos os observadores registados (notifyobservers). public class java.util.observable { // adiciona um observador ao conjunto dos observadores deste objeto public synchronized void addobserver(observer o) // remove um observador ao conjunto dos observadores deste objeto public synchronized void deleteobserver(observer o) // coloca uma flag interna que indica que o estado deste objeto Observable mudou protected synchronized void setchanged() // coloca uma flag interna que indica que o estado deste objeto Observable não mudou protected synchronized void clearchanged() // verifica a flag interna para ver se o estado deste Observable mudou e notifica todos os // observadores; o argumento arg indica o que mudou public void notifyobservers(object arg) // verifica a flag interna e notifica todos os observadores se o objeto mudou public void notifyobservers()...

O método notifyobservers(object arg) verifica se o estado deste Observable mudou, como indicado pelo método haschanged, notifica todos os observadores e em seguida invoca o método clearchanged para colocar uma flag interna para indicar que este objecto não mudou. Cada objecto observador tem o seu método update com dois argumentos: este objeto sujeito e o argumento arg. O argumento arg pode ser usado para indicar que atributo do sujeito que mudou. O método notifyobservers() é semelhante ao de cima mas não envia o argumento arg. Neste caso o observador não recebe indicação sobre qual o atributo do sujeito que mudou. A interface Observer declara o seguinte método: update(observable obs, Object arg) Uma classe implementa a interface Observer quando quer ser informada de mudanças em objetos Observable. O método notifyobservers da classe Observable notifica todos os objectos Observer registados invocando para cada um o método update(observable obs, Object arg). O 1.º argumento do método update serve para o observer poder interrogar o objecto observable para determinar o seu novo estado. classe Sujeito: public class Sujeito extends Observable { private int temperatura = 20; //dados do sujeito que podem variar // simula ocorrencia de variacoes da temperatura public void iniciavariacaotemperatura() { while (true) { try { Thread.sleep(5000); catch (InterruptedException e) { int variacao = 1 + (int) (5 * Math.random()); int sinalvariacao = (Math.random() < 0.5)? -1 : 1; variacao = sinalvariacao * variacao; mudatemperatura(variacao); private void mudatemperatura(int variacao) { this.temperatura += variacao; setchanged(); notifyobservers(temperatura); classe Observador1: import java.util.observer; public class Observador1 implements Observer { public void update(observable sujeito, Object temperatura) { this.temperatura = (Integer)temperatura; System.out.println("Observador1: temperatuta actual= " + temperatura);

classe Observador2: import java.util.observer; public class Observador2 implements Observer { public void update(observable sujeito, Object temperatura) { this.temperatura = (Integer)temperatura; System.out.println("Observador2: temperatuta actual= " + temperatura); classe Main: public class Main { public static void main(string[] args) { Sujeito sujeito = new Sujeito(); Observable suj = sujeito; Observer obs1 = new Observador1(); Observer obs2 = new Observador2(); suj.addobserver(obs1); suj.addobserver(obs2); sujeito.iniciavariacaotemperatura();