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