terça-feira, 9 de novembro de 2010

Observer Pattern



Definição

Um observer é um padrão estrutural que permite a publicar / sobreescrever funcionalidades. Isso é feito por um objeto autônomo, um editor que permite a inscrição de outros objetos para anexar ou desanexar. O padrão não impõe qualquer limite ao número de observers que podem anexar, ou subscrever, se a notificação sobre as mudanças futuras estiverem no estado do editor.

Quando usar

Quando um objeto deseja publicar informações e muitos objetos terão de
receber essas informações.

Benefícios
Aproveita-se para um acoplamento fraco entre editor e assinantes como o editor não precisa saber quem ou quantos assinantes haverá.

Desvantagens / consequências
Em um cenário complexo, pode haver problemas para determinar se a
atualização para o publisher é relevante para todos os assinantes ou apenas alguns deles. Enviando um sinal de atualização para todos os assinantes podem impor uma sobrecarga de comunicação de informações que não é necessária.

Exemplo

package observer;

public interface IObserver {
void update(String state);
}

package subject;
import observer.IObserver;

public class Observer implements IObserver {
private String state;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public void update(String state) {
setState(state);
System.out.println(
"Observer has received update signal with new state: "
+ getState());
}
}

package observer;

public class Observer1 implements IObserver {
private String state;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public void update(String state) {
setState(state);
System.out.println(
"Observer1 has received update signal with new state: "
+ getState());
}
}

package observer;

public class Observer2 implements IObserver {
private String state;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public void update(String state) {
setState(state);

System.out.println("
Observer2 has received update signal with new state: "
+ getState());
}
}

package subject;
import java.util.*;
import observer.IObserver;

public class LogSubject {
private List<IObserver> observerList = new ArrayList<IObserver>();
private String state;

public String getState() {
return state;
}

public void attach(IObserver observer) {
observerList.add(observer);
}

public void detach(IObserver observer) {
observerList.remove(observer);
}

public void setState(String state) {
this.state = state;
stateChanged();
}



private void stateChanged() {
for (IObserver item: observerList) {
item.update(getState());
}
}
}

package observer;
import subject.*;

public class Client {
public static void main(String[] args) {
LogSubject subject = new LogSubject();
IObserver ob = new Observer();
IObserver ob1 = new Observer1();
IObserver ob2 = new Observer2();
subject.attach(ob);
subject.attach(ob1);
subject.attach(ob2);
subject.setState("state1");
subject.setState("state2");
subject.detach(ob1);
subject.setState("state3");
}



Quando o cliente é executado, o resultado é:
 Observador recebeu sinal de atualização com novo estado: Membro1
 Observer1 recebeu sinal de atualização com novo estado: Membro1
 Observer2> recebeu sinal de atualização com novo estado: Membro1
 Observador recebeu sinal de atualização com novo estado: state2
 Observer1 recebeu sinal de atualização com novo estado: state2
 Observer2> recebeu sinal de atualização com novo estado: state2
 Observador recebeu sinal de atualização com novo estado: state3
 Observer2> recebeu sinal de atualização com novo estado: state3




Nenhum comentário:

Postar um comentário