Design patterns
Опубликовать-Подписка
Поиск…
Опубликовать-Подписаться на Java
Абонент-издатель - знакомая концепция, учитывая рост YouTube, Facebook и других социальных сетей. Основная идея заключается в том, что существует Publisher
который создает контент и Subscriber
который потребляет контент. Всякий раз, когда Publisher
создает контент, каждый Subscriber
уведомляется. Subscribers
теоретически могут быть подписаны более чем на одного издателя.
Обычно существует ContentServer
который находится между издателем и подписчиком, чтобы помочь оповестить обмен сообщениями
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) {
...
}
}
}
Обычно шаблон шаблона pub-sub реализуется с учетом многопоточного представления. Одна из наиболее распространенных реализаций рассматривает каждого Subscriber
как отдельный поток, при этом ContentServer
управляет пулом потоков
Простой пример pub-sub в JavaScript
Издателям и подписчикам не нужно знать друг друга. Они просто общаются с помощью очередей сообщений.
(function () {
var data;
setTimeout(function () {
data = 10;
$(document).trigger("myCustomEvent");
}, 2000);
$(document).on("myCustomEvent", function () {
console.log(data);
});
})();
Здесь мы опубликовали пользовательское событие с именем myCustomEvent и подписались на это событие. Поэтому им не нужно знать друг друга.