Exemplo do Padrão de Projetos “Observador” em Java

2 minutos de leitura

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