El patrón de diseño Publicador/Suscriptor (también conocido como Pub/Sub) es un patrón de mensajería en el cual los emisores de mensajes (publicadores) no envían mensajes directamente a receptores específicos (suscriptores). En cambio, los mensajes se categorizan en diferentes temas, y los suscriptores se suscriben a los temas de interés. Cuando un mensaje se publica en un tema, todos los suscriptores de ese tema reciben el mensaje.
Implementación del Patrón Pub/Sub en Java
A continuación, te muestro una implementación básica del patrón Pub/Sub en Java.
Paso 1: Crear la interfaz de Suscriptor
public interface Suscriptor {
void actualizar(String mensaje);
}
Paso 2: Implementar la clase Publicador
import java.util.ArrayList;
import java.util.List;
public class Publicador {
private List<Suscriptor> suscriptores = new ArrayList<>();
public void suscribir(Suscriptor suscriptor) {
suscriptores.add(suscriptor);
}
public void desuscribir(Suscriptor suscriptor) {
suscriptores.remove(suscriptor);
}
public void notificarSuscriptores(String mensaje) {
for (Suscriptor suscriptor : suscriptores) {
suscriptor.actualizar(mensaje);
}
}
public void publicarMensaje(String mensaje) {
System.out.println("Publicando mensaje: " + mensaje);
notificarSuscriptores(mensaje);
}
}
Paso 3: Crear una clase concreta de Suscriptor
public class SuscriptorConcreto implements Suscriptor {
private String nombre;
public SuscriptorConcreto(String nombre) {
this.nombre = nombre;
}
@Override
public void actualizar(String mensaje) {
System.out.println(nombre + " recibió mensaje: " + mensaje);
}
}
Paso 4: Probar el patrón Pub/Sub
public class PubSubDemo {
public static void main(String[] args) {
Publicador publicador = new Publicador();
Suscriptor suscriptor1 = new SuscriptorConcreto("Suscriptor 1");
Suscriptor suscriptor2 = new SuscriptorConcreto("Suscriptor 2");
publicador.suscribir(suscriptor1);
publicador.suscribir(suscriptor2);
publicador.publicarMensaje("Mensaje 1");
publicador.desuscribir(suscriptor1);
publicador.publicarMensaje("Mensaje 2");
}
}
Explicación
1. Interfaz de Suscriptor (Suscriptor): Define un método actualizar que los suscriptores concretos deben implementar para recibir mensajes.
2. Clase Publicador (Publicador): Mantiene una lista de suscriptores y proporciona métodos para suscribir, desuscribir y notificar a los suscriptores. Cuando se publica un mensaje, se notifica a todos los suscriptores.
3. Clase concreta de Suscriptor (SuscriptorConcreto): Implementa la interfaz Suscriptor y define cómo se procesan los mensajes recibidos.
4. Clase de demostración (PubSubDemo): Demuestra cómo crear un publicador y suscriptores, suscribir y desuscribir a los suscriptores, y publicar mensajes.
Este ejemplo básico puede ser extendido para incluir más funcionalidades, como diferentes temas, filtros de mensajes, y un manejo más sofisticado de los suscriptores y los mensajes.