Design patterns
Veröffentlichen-Abonnieren
Suche…
Publish-Subscribe in Java
Der Publisher-Abonnent ist angesichts der Verbreitung von YouTube, Facebook und anderen Social Media-Diensten ein bekanntes Konzept. Das Grundkonzept besteht darin, dass ein Publisher
Inhalte generiert und ein Subscriber
Inhalte konsumiert. Wenn der Publisher
Inhalt generiert, wird jeder Subscriber
benachrichtigt. Subscribers
können theoretisch bei mehreren Verlagen abonniert werden.
Normalerweise gibt es einen ContentServer
, der sich zwischen Herausgeber und Abonnent befindet, um das Messaging zu vermitteln
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) {
...
}
}
}
Normalerweise wird das Pub-Sub-Entwurfsmuster unter Berücksichtigung einer Multithread-Ansicht implementiert. Eine der häufigsten Implementierungen sieht jeden Subscriber
als separaten Thread, wobei der ContentServer
einen Thread-Pool verwaltet
Ein einfaches Pub-Sub-Beispiel in JavaScript
Publisher und Abonnenten müssen sich nicht kennen. Sie kommunizieren einfach mit Hilfe von Message Queues.
(function () {
var data;
setTimeout(function () {
data = 10;
$(document).trigger("myCustomEvent");
}, 2000);
$(document).on("myCustomEvent", function () {
console.log(data);
});
})();
Hier haben wir ein benutzerdefiniertes Ereignis namens myCustomEvent veröffentlicht und dieses Ereignis abonniert. Sie müssen sich also nicht kennen.