Olá Pessoal,
No post de hoje vamos conhecer o padrão comportamental Observer, que tem como objetivo notificar e atualizar classes dependentes de forma automática com base no status. Veremos isso na prática, simulando uma notificação em uma fila por meio de um painel eletrônico.
Lets go…
Observer
Tem como função notificar e atualizar automaticamente classes que dependem do status de outra para fazer uma ação.
Ex.: Quando o estoque do Produto X ficar abaixo de 20, automaticamente notifica o fornecedor.
Essa é uma prática comum em grandes redes de supermercado para manter os produtos de alta demanda sempre disponível para o cliente. Exemplo: “Leite Ninho”. Há uma integração entre o sistema do supermercado e fornecedor, um Observer. Para o fornecedor não ter que ficar todo dia verificando o estoque do supermercado, é melhor que ele seja notificado quando a quantidade de produto estiver próximo de acabar.
Outro exemplo é quando vamos ao supermercado ou ao banco e há um painel eletrônico que nos informa o caixa livre que devemos ir, mas para isso acontecer é preciso que o caixa notifique o painel que ele já está disponível.
No diagrama acima há um esboço do relacionamento entre as classes.
Vamos ver isso na prática. A seguir, o nosso projeto Observer:
Primeiramente vamos criar a nossa interface Observer:
package br.com.camilolopes.observer;
import br.com.camilolopes.classes.Caixa;
public interface Observer {
void notificaPainel(Caixa caixa);
}
Ela tem um método que recebe o caixa disponível.
Agora vamos criar a classe Caixa que notifica o Painel quando o status é alterado:
Caixa.java
package br.com.camilolopes.classes;
import java.util.HashSet;
import java.util.Set;
import br.com.camilolopes.observer.Observer;
public class Caixa {
private boolean status = false;
//apenas os caixas que estão funcionando serão os interessados
private Set<Observer> interessados = new HashSet<Observer>();
private String nomeCaixa;
//todo caixa tem um nome + um nro.
public Caixa(String nomeCaixa) {
this.nomeCaixa = nomeCaixa;
}
public boolean isStatus() {
return status;
}
/*
* quando o status é alterado
* notifica o painel
*/
public void setStatus(boolean status) {
this.status = status;
/*
* A mágica está aqui. Notificados o painel que o caixa
* foi alterado. No nosso caso temos apenas um Painel, mas
* poderíamos ter N painéis. Observe quantos painéis temos
* em uma agência bancaria: Um para pessoa física, caixa rápido
* pessoa jurídica etc. Cada um associado a um tipo de caixa (01,02…)
*/
for(Observer interessado : interessados){
interessado.notificaPainel(this);
}
}
public void registraInteressado(Observer interessado){
this.interessados.add(interessado);
}
public String getNomeCaixa() {
return nomeCaixa;
}
public void setNomeCaixa(String nomeCaixa) {
this.nomeCaixa = nomeCaixa;
}
}
Precisamos agora criar o interessado em saber quando o status do caixa é alterado, que no nosso caso é o Painel.
package br.com.camilolopes.observer;
import br.com.camilolopes.classes.Caixa;
/*
* o interessado em saber a mudança
* do status */
public class Painel01 implements Observer {
@Override
public void notificaPainel(Caixa caixa) {
System.out.println(“O ” + caixa.getNomeCaixa() + ” está disponivel.Status alterado para ” + caixa.isStatus());
}
}
Para finalizar, temos uma classe com método main para validar:
ObserverMain.java
package br.com.camilolopes.main;
import br.com.camilolopes.classes.Caixa;
import br.com.camilolopes.observer.Painel01;
public class ObserverMain {
public static void main(String[] args) {
Painel01 painel01 = new Painel01();
//poderiamos ter outros paineis para N caixas
//teve o status alterado
Caixa caixa1 = new Caixa(“Caixa 1”);
caixa1.registraInteressado(painel01);
caixa1.setStatus(true);
Caixa caixa2 = new Caixa(“Caixa 2”);
caixa2.registraInteressado(painel01);
//nao teve o status alterado
}
}
Rode a aplicação e veja o resultado.
Resultado
Aqui está o nosso resultado. Observe que exibe apenas alteração para o caixa 1, pois este objeto sofreu alteração.
Vou ficando por aqui, espero que tenham gostado do post.
Abraços, see ya.
Cara eu so queria saber oque é esse “nro” que diz q todo caixa precisa? tipo q merda é essa?um identificador? token?
A Vlw ajudou msm essas suas explicaçoes sobre gof sao MUITO mais faceis de entender que os outros sites que eu li.