Design patterns
出版 - 購読
サーチ…
Javaでのパブリッシュ/サブスクライブ
パブリッシャー/サブスクライバーは、YouTube、Facebook、その他のソーシャルメディアサービスが登場したことを考えると、おなじみのコンセプトです。基本的な概念は、コンテンツを生成するPublisher
とコンテンツを消費するSubscriber
が存在することです。 Publisher
がコンテンツを生成するたびに、各Subscriber
に通知されます。 Subscribers
は理論的には複数の出版社に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デザインパターンはマルチスレッドビューで実装されています。より一般的な実装の1つは、各Subscriber
を個別のスレッドとして認識し、 ContentServer
はスレッドプールを管理します
JavaScriptの単純なpub-subの例
出版社と購読者はお互いを知る必要はありません。それらは単にメッセージキューの助けを借りて通信します。
(function () {
var data;
setTimeout(function () {
data = 10;
$(document).trigger("myCustomEvent");
}, 2000);
$(document).on("myCustomEvent", function () {
console.log(data);
});
})();
ここでは、 myCustomEventという名前のカスタムイベントを公開し、そのイベントに登録しました。だから彼らはお互いを知る必要はありません。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow