Exemplo do Padrão de Projetos “Observador” em Java
Atualizado em:
Padrões de Projeto ajudam e muito a vida dos desenvolvedores de software, afinal para que reinventar a roda, se ela já foi criada?
Essa é a ideia dos Padrões de Projeto: reutilizar conceitos genéricos para propósitos concretos.
Este é um exemplo Padrão Observador feito em Java:
Utilizei quatro classes: Soma.java, Par.java, Impar.java e Programa.java
O padrão Observador parte do conceito de um Objeto Observável (Soma.java), onde a cada mudança de estado ele notifica aqueles que estão Observando sua instância (Par.java e Impar.java)
Soma.java
Nesta classe, implemento outro padrão de projeto, o Singleton, onde eu possuo uma única instancia desta classe em todo meu projeto.
Esta classe basicamente inicia um contador, dentro de uma Thread, incrementando a cada 1 segundo, e a cada mudança de valor todos os Objetos que estão observando este, são notificados.
package observador;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Soma extends Observable implements Runnable {
private int num;
public static Soma instance = null;
private Soma() {
num = 0;
}
public static Soma getInstance() {
if (instance == null) {
instance = new Soma();
Thread t1 = new Thread(instance);
t1.start();
}
return instance;
}
public void setNum() {
num++;
setChanged(); // marca esse objeto observável como alterado
notifyObservers(); // notifica todos os observadores que esse objeto foi alterado
}
public int getNum() {
return num;
}
private void somar() {
while (true) {
setNum();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(Soma.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
@Override
public void run() {
somar();
}
}Par.java
Esta classe é notificada, através do método update(), quando há alteração no valor em Soma.java, se for par, exibe na tela
package observador;
import java.util.Observable;
import java.util.Observer;
public class Par implements Observer {
private Soma s = Soma.getInstance();
@Override
public void update(Observable o, Object arg) {
if (s.getNum() % 2 == 0) {
System.out.println(s.getNum() + " é Par");
}
}
}Impar.java
Esta classe é notificada, através do método update(), quando há alteração no valor em Soma.java, se for impar, exibe na tela
package observador;
import java.util.Observable;
import java.util.Observer;
public class Impar implements Observer {
private Soma s = Soma.getInstance();
@Override
public void update(Observable o, Object arg) {
if (s.getNum() % 2 == 1) {
System.out.println(s.getNum() + " é Ímpar");
}
}
}Programa.java
Classe que inicia tudo! Detalhe que preciso adicionar minhas classes para serem observadoras de Soma, com o método addObserver()
package observador;
public class Programa {
public static void main(String[] args) {
Soma s = Soma.getInstance();
Par par = new Par();
Impar impar = new Impar();
s.addObserver(par);
s.addObserver(impar);
}
}Adicionar ou remover outras classes fica fácil agora, basta implementar a interface Observer e adicionar a lista de Observadores.
Espero que tenha sido útil esta dica. :D

Deixe um comentário