necesito alguna idea

nonono
21 de Octubre del 2005
Hola,

Tengo una serie de objetos instanciados en un servlet y acoplados a una sesión que quiero que \'reaccionen\' ante un determinado suceso que puede ocurrir en cualquier momento. Estos sucesos pueden ocurrir en el ámbito del servlet o de cualquiera de estos objetos. Por ejemlo, uno de los objetos hace un acceso a una base de datos pero no obtiene el resultado esperado y tiene que informar a todos los demás.

Alguien me puede decir cuál sería el mecanismo más adecuado para implementar algo así? Habia pensado en los eventos, pero parecen pensados unicamente para manejar componentes visuales. Me interesaría especialmente saber cómo puedo lanzar un mensaje de difusión o algo así a todos los objetos involucrados.


gracias

Mario Arias SCJP
21 de Octubre del 2005
Esto parace un trabajo para un Patron de Diseño llamado Observer la definición de este patron de diseño es la siguiente :

Define una dependencia de uno a muchos objetos, cuando un objeto cambia de estado, todos sus objetos de dependientes son notificados y actualizados.

la implementación no estan sencilla pero se logra.... vamos a empezar por el principio (esto va a ser muy largo, lo mas probable es que lo hagamos por partes, no te desesperes)

PRIMERO

El patron de diseño Observer define 2 interfaces, un Publicador y un observador, en ingles Subject y Observer.

vamos a ver las responsabilidades de cada uno,

El Subject se encarga de inscribir observers, desinscribirlos, y notificar cuando hay un cambio Ejemplo, un periodico, un canal de noticias o una lista de correos.

El observer se encarga de escuchar esos cambios y tomar las acciones respectivas segun sea el caso.

te quedo Claro???

En la siguiente parte te explicare con un ejemplo como implementar este patron con un ejemplo

Mario Arias SCJP
21 de Octubre del 2005
Bueno vamos a suponer, que somos una agencia de noticias, y estamos cubriendo la final del mundial de futbol Alemania 2006, existen dos noticieros interesados en recibir la información de cuando se marca un gol.

vamos por el codigo...

primero la interface Observer, que van a implementar los noticieros

public interface Observer{

public void notificarGol(int equipo1, int equipo2);

}

este metodo recibe los goles de cada equipo


ahora la interface Subject

public interface Subject{

public void addObserver(Observer ob);

public void removeObserver(Observer ob);

public void notifyObserver();
}

el primer metodo agrega un observer,
el segundo quita un observer,
y el ultimo es para notificar los cambios

(Este es el mismo patron que se implementa en Swing o en AWT para el manejo de eventos... acaso el metodo para agregar un listener no es public void addActionListener(ActionListener al)??? y ActionListener no es una interface???, ves que bonitos son los patrones de diseño)

Hasta aqui todo claro????

bueno vamos a implementar las interfaces, primero los noticieros

public Class NoticieroTV implements Observer{

public void notificarGol(int equipo1, int equipo2){

System.out.println("Señoras y señores vamos " + equipo1+ " a " equipo2);

}

}

ahora el otro

public Class NoticieroRadial implements Observer{

public void notificarGol(int equipo1, int equipo2){

System.out.println("LES INFORMAMOS EL MARCADOR " + equipo1+ " a " equipo2);

}

}

ahora la agencia de noticias

import java.util.ArrayList;

public Class Agencia implements Subject{

private ArrayList observers = new ArrayList();
private int equipo1 = 0;
private int equipo2 = 0;

//Metodos de la interface Subject
public void addObserver(Observer ob){
this.observers.add(ob);

}

public void removeObserver(Observer ob){
int i = this.observers.indexOf(ob)
if(i >= 0){
this.observers.remove(i)
}

}

public void notifyObserver(){
for(int i = 0;i < this.observers.size();i++){
Observer ob = (Observer)this.observers.get(i);
ob.notificarGol(this.equipo1,this.equipo2);
}

}

//Metodos propios de la Clase Agencia

public void setEquipo1(int equipo1){
this.equipo1 = equipo1;
this.notifyObserver();
}

public void setEquipo2(int equipo2){
this.equipo2 = equipo2;
this.notifyObserver();
}

}

Cuando se cambia un valor a travez de los metodos settter de la clase se le notifica a todos los observers que esten dentro del ArrayList.

Sencillisimo, cierto???

Me entendiste todo este monton de explicaciones???

Espero que te haya sido de ayuda, y puedas implentar la solucion que necesites