necesito alguna idea
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
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
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
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
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
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