Design patterns
Publish-Abonneren
Zoeken…
Publiceren - Abonneren op Java
De uitgever-abonnee is een bekend concept gezien de opkomst van YouTube, Facebook en andere sociale mediadiensten. Het basisconcept is dat er een Publisher
die inhoud genereert en een Subscriber
die inhoud gebruikt. Telkens wanneer de Publisher
inhoud genereert, wordt elke Subscriber
op de hoogte gebracht. Subscribers
kunnen in theorie worden geabonneerd op meer dan één uitgever.
Meestal is er een ContentServer
die tussen de uitgever en de abonnee zit om de berichten te bemiddelen
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) {
...
}
}
}
Gewoonlijk wordt het pub-sub ontwerppatroon geïmplementeerd met een multithreaded weergave in gedachten. Een van de meest voorkomende implementaties ziet elke Subscriber
als een afzonderlijke thread, waarbij de ContentServer
een ContentServer
beheert
Eenvoudig pub-sub-voorbeeld in JavaScript
Uitgevers en abonnees hoeven elkaar niet te kennen. Ze communiceren eenvoudig met behulp van berichtenwachtrijen.
(function () {
var data;
setTimeout(function () {
data = 10;
$(document).trigger("myCustomEvent");
}, 2000);
$(document).on("myCustomEvent", function () {
console.log(data);
});
})();
Hier hebben we een aangepast evenement met de naam myCustomEvent gepubliceerd en ons geabonneerd op dat evenement. Ze hoeven elkaar dus niet te kennen.