Design patterns
Publicera-RSS
Sök…
Publicera-prenumerera i Java
Förlagsabonnenten är ett välkänt koncept med tanke på ökningen av YouTube, Facebook och andra sociala mediatjänster. Det grundläggande konceptet är att det finns en Publisher
som genererar innehåll och en Subscriber
som konsumerar innehåll. När Publisher
genererar innehåll, meddelas varje Subscriber
. Subscribers
kan teoretiskt prenumereras på mer än en förläggare.
Vanligtvis finns det en ContentServer
som sitter mellan utgivare och prenumerant för att hjälpa mediera meddelandet
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) {
...
}
}
}
Vanligtvis implementeras designmönstret för pub-sub med tanke på en flertrådad vy. En av de vanligare implementeringarna ser varje Subscriber
som en separat tråd, där ContentServer
hanterar en ContentServer
Enkelt pub-sub-exempel i JavaScript
Förlag och prenumeranter behöver inte känna varandra. De kommunicerar helt enkelt med hjälp av meddelandeköer.
(function () {
var data;
setTimeout(function () {
data = 10;
$(document).trigger("myCustomEvent");
}, 2000);
$(document).on("myCustomEvent", function () {
console.log(data);
});
})();
Här publicerade vi en anpassad händelse med namnet myCustomEvent och prenumererade på den händelsen. Så de behöver inte känna varandra.