Hélio Engholm Jr

Especializado em Engenharia de Software

 

Figura 11.1 – Diagrama de classe do exemplo observerpatternNeste artigo, estaremos abordando o design patter observer.

O padrão Observer é responsável pela dependência um para muitos entre objetos distintos, permitindo que os objetos sejam notificados sobre a mudança de estado de outros objetos. Neste contexto, temos o objeto observado e os objetos observadores, sendo que o observado não necessita conhecer os observadores, mas apenas enviar notificações para esses da ocorrência de possíveis mudanças. O observado e os observadores também podem ser referenciados como Subject e Observer respectivamente.

Implementando o padrão Observer

O padrão Observer pode ser implementado de várias maneiras. Em nosso exemplo iremos utilizar duas interfaces, a Subject e Observer, que serão implementadas por classes concretas. A classe concreta que implementará a interface Subject será responsável por notificar os objetos observadores pelo uso de uma mensagem.

Cenário do exemplo

Para exemplificar o padrão Observer, imagine um sistema para uma empresa de telefonia celular que deseja enviar, quando necessário, mensagens para todos os seus assinantes relacionadas a promoções de qualquer tipo. Neste cenário, teremos um subject que, quando comandado, notificará todos os observers, que nesse exemplo são os aparelhos celulares dos clientes da telefônica, com uma determinada mensagem.

Para implementar este exemplo, vamos criar a interface Subject, que definirá os métodos de adição e exclusão de observadores, além do método que notifica os observadores de algum evento – em nosso caso, uma nova mensagem para todo os clientes. Também será criada uma segunda interface para os observadores, definindo o método updateMensagem(), que será responsável por receber um objeto Mensagem e montar a mensagem a ser enviada para cada objeto Assinante considerando o nome de cada uma delas. A figura 1 mostra o diagrama de classes associado a esse exemplo.

 

Figura 11.1 – Diagrama de classe do exemplo do padrão Observer.

Código-fonte em Java

Veja a seguir o código-fonte em Java que implementa o exemplo do cenário especificado na seção 11.4.2, relacionado ao padrão Observer.

Interface Observer

package interfacePackage;

import observer.Assinante;

import observer.Mensagem;

public interface Observer {

public void updateMensagem(Mensagem mensagem);

}

Interface Subject

package interfacePackage;

import observer.Assinante;

import observer.Mensagem;

public interface Subject {

public void addObserver(Observer o);

public void removeObserver(Observer o);

public void notifyObservers(Mensagem mensagem);

}

Classe concreta Assinante

package observer;

import interfacePackage.Observer;

public class Assinante implements Observer {

private String nome = “”, rua = “”, bairro = “”, mensagem = “”;

private int numero;

public Assinante(String nome, String rua, int numero, String bairro) {

this.nome = nome;

this.rua = rua;

this.numero = numero;

this.bairro = bairro;

}

// Construtor

public Assinante() {}

public Assinante(String nome) {this.nome = nome;}

// Métodos de acesso

public String getEndereco() { return rua + “, “ + numero + “ – “ + bairro; }

public String getNome() { return nome; }

public void setMensagem(Mensagem mensagem) {this.mensagem = mensagem.getMensagem();}

public String getMensagem() { return mensagem; }

@Override

public void updateMensagem(Mensagem mensagemBean) {

mensagem = “Sr(a) “+ nome + “. Voce tem uma nova mensagem: ” + mensagemBean.getMensagem();

}

}

Classe concreta CentralSubject

package observer;

import java.util.ArrayList;

import java.util.Iterator;

import interfacePackage.Observer;

import interfacePackage.Subject;

public class CentralSubject implements Subject{

private ArrayList<Observer> observers = new ArrayList<Observer>();

@Override

public void addObserver(Observer o) {

observers.add(o);

}

public void removeObserver(Observer o) {

observers.remove(o);

}

public void notifyObservers(Mensagem mensagem) {

Iterator<Observer> it = observers.iterator();

while (it.hasNext()) {

Observer observer = it.next();

observer.updateMensagem(mensagem);

}

}

public ArrayList<Observer>getObservers() { return observers; }

}

Classe Mensagem

package observer;

public class Mensagem {

String mensagem = “”;

public Mensagem(String mensagem) {this.mensagem = mensagem;}

public void setMensagem(String mensagem) {this.mensagem=mensagem;}

public String getMensagem() {return mensagem;}

}

Classe ObserverMain

package observer;

public class ObserverMain {

public static void main(String[] args) {

Mensagem mensagem = new Mensagem(“Temos um livro de padrões de design para voce!”);

CentralSubjectcs = new CentralSubject();

Assinante a = new Assinante(“Claudia”);

cs.addObserver(a);

Assinante b = new Assinante(“Pamella”);

cs.addObserver(b);

cs.notifyObservers(mensagem);

System.out.println(“Mensagem assinante A:   ” + a.getMensagem());

System.out.println(“Mensagem assinante B:   ” + b.getMensagem());

}

}

 

Saiba mais em

Livro Análise e Design

Link Novatec: http://www.novatec.com.br/livros/analise-design/

Link Livraria Cultura:

http://www.livrariacultura.com.br/scripts/resenha/resenha.asp?nitem=42129370

Livraria Saraiva: 

http://www.livrariasaraiva.com.br/produto/4912029




+ Artigos