Design Patterns – Padrão Observer

Design Patterns – Padrão Observer

O padrão Observer mantém seus objetos informados quando algo que possa lhes interessar acontece. Este é um dos padrões mais usados do JDK (Java Development Kit) por ser muito útil.

Fazendo uma analogia ao mundo real, para que todos possam entender de forma bem simples como funciona os padrões. Vamos a um exemplo de observer no mundo real:

1. Uma editora começa a publicar jornais.

2. Você faz uma assinatura deste jornal e recebe periodicamente a cada nova edição.

3. Você cancela a assinatura quando não deseja mais receber os jornais, e eles param de entregar.

4. Enquanto a editora continua fabricando jornais, outras pessoas, hotéis, companhias aéreas e outras empresas fazem e cancelam assinaturas de jornal constantemente.

Se você entendeu o raciocínio acima, então você entende o funcionamento do padrão observer.

Vamos a um outro exemplo, para você ter certeza de que entendeu o padrão.

Digamos que você está procurando emprego. E que conheceu um daqueles sites de emprego online, onde você se cadastra e recebe por email as vagas que são publicadas. Então você tem algumas opções, deseja receber todas as novas oportunidades por email, ou você cria um filtro e diz que deseja receber apenas vagas de jornalismo por email, o restante você não deseja ser avisado.

Quando uma nova oportunidade de jornalismo for cadastrada no site, você será informado por email.

Se você conseguir este emprego, pode cancelar sua conta no site, ou apenas desabilitar a opção de ser avisado por email sobre novas oportunidades. Você cancela sua assinatura com o site. Então você para de receber as ofertas, mas todas as outras pessoas continuam recebendo.

É assim que funciona o padrão observer. Você que recebe as novidades é o observador.

Em uma definição mais conceitual, padrão observer se define como:

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.

Em java a implementação java.util de Observer/Observable não é o único lugar que você vai encontrar o padrão Observer no JDK. Javabeans e Swing também fornecem suas implementações do padrão.

Vamos ver agora um exemplo escrito em java usando o padrão:

//importamos as classes, basico!
import java.util.Observable;
import java.Observer;

//criamos nossa classe que eh uma extensao de observable.
public class PrevisaoTempo extends Observable {
private float temperatura;
private float umidade;
private float pressao;

public PrevisaoTempo() {
}

public void tempoMudou() {
setChanged(); //indica que o estado do objeto mudou.
notifyObservers();
}

//o metodo q recebe os novos valores e chama o metodo que avisa os observadores.
public void setTempo(float temperatura, float umidade, float pressao) {
this.temperatura = temperatura;
this.umidade = umidade;
this.pressao = pressao;
tempoMudou();
}

//os gets
public float getTemperatura() {
return temperatura;
}

public float getUmidade() {
return umidade;
}

public float getPressao() {
return pressao;
}
}

e nosso observador:

//importa as classes, basico!
import java.util.Observable;
import java.util.Observer;

//nossa classe que implementa as interfaces observer e displayElement.
public class ExibirCondicoesTempo implements Observer, DisplayElement {
Observable observable;
private float temperatura;
private float umidade;

//nosso construtor que se junta a lista de observadores.
public ExibirCondicoesTempo( Observable observable ) {
this.observable = observable;
observable.addObserver(this);
}

//implementa o metodo update da interface Observer para atualizar os valores.
public void update( Observable obs, Object arg ) {
if ( obs instanceof PrevisaoTempo ) {
PrevisaoTempo previsaoTempo = (PrevisaoTempo) obs;
this.temperatura = previsaoTempo.getTemperatura();
this.umidade = previsaoTempo.getUmidade();
display();
}
}

//implementa o metodo da interface displayElement para exibir a mensagem.
public void display() {
System.out.println("Condicao do tempo: "+temperatura+" graus e umidade em "+umidade+" %");
}
}

Com o suporte interno do Java, tudo que você precisa fazer é extender Observable e informá-lo quando notificar os Observadores. A API faz o resto pra você.

Pra quem sabe programar em java, acredito que o código acima esteja bem claro e fácil de entender. Quem não sabe java realmente pode ficar um pouco perdido, neste caso eu recomendo que comece estudando a sintaxe da linguagem antes de entrar nos padrões.

Quem quizer acrescentar alguma coisa ao conteúdo, use o comentário abaixo, eu sei que não explorei o conteúdo todo, foi mais uma idéia do que é o padrão mesmo.

Sucesso a todos!



Sobre o Autor

MarioSAM é faixa preta 2Dan de Taekwondo. Entusiasta do marketing online. Especulador do mercado financeiro. Projetista web com certificação SCJP da SUN. Com 10 anos de experiência em desenvolvimento de sistemas.