Design patterns
Publicar-Suscribir
Buscar..
Publicar-Suscribir en Java
El editor-suscriptor es un concepto familiar dado el auge de YouTube, Facebook y otros servicios de medios sociales. El concepto básico es que hay un Publisher
que genera contenido y un Subscriber
que consume contenido. Cada vez que el Publisher
genera contenido, se notifica a cada Subscriber
. Subscribers
pueden, en teoría, suscribirse a más de un editor.
Por lo general, hay un ContentServer
que se ubica entre el editor y el suscriptor para ayudar a mediar en la mensajería.
public class Publisher {
...
public Publisher(Topic t) {
this.topic = t;
}
public void publish(Message m) {
ContentServer.getInstance().sendMessage(this.topic, m);
}
}
public class ContentServer {
private Hashtable<Topic, List<Subscriber>> subscriberLists;
private static ContentServer serverInstance;
public static ContentServer getInstance() {
if (serverInstance == null) {
serverInstance = new ContentServer();
}
return serverInstance;
}
private ContentServer() {
this.subscriberLists = new Hashtable<>();
}
public sendMessage(Topic t, Message m) {
List<Subscriber> subs = subscriberLists.get(t);
for (Subscriber s : subs) {
s.receivedMessage(t, m);
}
}
public void registerSubscriber(Subscriber s, Topic t) {
subscriberLists.get(t).add(s);
}
public class Subscriber {
public Subscriber(Topic...topics) {
for (Topic t : topics) {
ContentServer.getInstance().registerSubscriber(this, t);
}
}
public void receivedMessage(Topic t, Message m) {
switch(t) {
...
}
}
}
Por lo general, el patrón de diseño pub-sub se implementa teniendo en cuenta una vista de multiproceso. Una de las implementaciones más comunes ve a cada Subscriber
como un hilo separado, con el ContentServer
gestionando un grupo de hilos
Ejemplo simple de pub-sub en JavaScript
Los editores y suscriptores no necesitan conocerse entre sí. Simplemente se comunican con la ayuda de colas de mensajes.
(function () {
var data;
setTimeout(function () {
data = 10;
$(document).trigger("myCustomEvent");
}, 2000);
$(document).on("myCustomEvent", function () {
console.log(data);
});
})();
Aquí publicamos un evento personalizado llamado myCustomEvent y suscribimos en ese evento. Así que no necesitan conocerse.