Design patterns
Publier-S'abonner
Recherche…
Publier-S'abonner en Java
L'éditeur-abonné est un concept familier étant donné l'essor de YouTube, de Facebook et d'autres services de médias sociaux. Le concept de base est qu’un Publisher
génère du contenu et un Subscriber
qui consomme du contenu. Chaque fois que l' Publisher
génère du contenu, chaque Subscriber
est averti. Subscribers
peuvent théoriquement être abonnés à plusieurs éditeurs.
Il existe généralement un ContentServer
situé entre l’éditeur et l’abonné pour faciliter la transmission des messages.
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) {
...
}
}
}
Habituellement, le modèle de conception de pub-sub est implémenté avec une vue multithreadée. L'une des implémentations les plus courantes considère chaque Subscriber
comme un thread distinct, le ContentServer
gérant un pool de threads.
Exemple de pub-sub simple en JavaScript
Les éditeurs et les abonnés n'ont pas besoin de se connaître. Ils communiquent simplement à l'aide de files d'attente de messages.
(function () {
var data;
setTimeout(function () {
data = 10;
$(document).trigger("myCustomEvent");
}, 2000);
$(document).on("myCustomEvent", function () {
console.log(data);
});
})();
Ici, nous avons publié un événement personnalisé nommé myCustomEvent et abonné à cet événement. Ils n'ont donc pas besoin de se connaître.