package com.interview.design.pattern.other;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* Created_By: stefanie
* Date: 14-12-3
* Time: 下午9:30
*
* Publish-Subscribe机制是个不错的选择,它的耦合性低,各个参与者之间毫无关联。
* 每一个消息都有一个唯一标识,一般都用字符串来描述,
*
* 比如用户管理模块中新添加了一个用户,于是它发送了一个消息:/UserManagment/User/Add,
* 消息的其他信息可以放置到一个Map中。
*
* In large scale system, it could be MessageQueue store all the messages, topic is Queue ID.
*
* http://www.cnblogs.com/west-link/archive/2011/11/21/2256788.html
*/
public class PublishSubscribePattern {
static interface MessageSubscriber {
public void onRecived(String message, Map params);
}
static class NewsLetterEmailSender implements MessageSubscriber{
@Override
public void onRecived(String message, Map params) {
String name = params.get("name").toString();
String email = params.get("email").toString();
System.out.printf("Sending news letter to %s at email %s\n", name, email);
}
}
static class NewsLetterInsiteSender implements MessageSubscriber{
@Override
public void onRecived(String message, Map params) {
String id = params.get("id").toString();
System.out.printf("Sending news letter to id %s by in-site message\n", id);
}
}
static class MessagePublisher {
private static MessagePublisher singleton;
private static Map<String,ArrayList<MessageSubscriber>> subscribers;
private MessagePublisher(){}
public static MessagePublisher instance(){
if(singleton == null)
singleton = new MessagePublisher();
return singleton;
}
public void register(String message, MessageSubscriber subscriber){
if(subscriber == null)
return;
if(subscribers == null)
subscribers = new HashMap<String, ArrayList<MessageSubscriber>>();
ArrayList<MessageSubscriber> subscriberList = subscribers.get(message);
if(subscriberList == null){
subscriberList = new ArrayList<MessageSubscriber>();
subscribers.put(message, subscriberList);
}
subscriberList.add(subscriber);
}
public void publish(String message, Map params){
if(subscribers == null)
return;
ArrayList<MessageSubscriber> subscriberList = subscribers.get(message);
if(subscriberList == null || subscriberList.isEmpty())
return;
for (MessageSubscriber topicSubscriber : subscriberList)
topicSubscriber.onRecived(message,params);
}
}
public static void main(String[] args){
NewsLetterEmailSender emailSender = new NewsLetterEmailSender();
MessagePublisher.instance().register("/UserManagment/User/Add", emailSender);
NewsLetterInsiteSender messageSender = new NewsLetterInsiteSender();
MessagePublisher.instance().register("/UserManagment/User/Add", messageSender);
Map params = new HashMap();
params.put("id", "summerzhao");
params.put("name", "Summer Zhao");
params.put("email", "******@gmail.com");
MessagePublisher.instance().publish("/UserManagment/User/Add", params);
}
}