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.
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
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