package com.github.techrobby.SimplePubSub; import java.util.ArrayList; import java.util.HashMap; /** * Created by syynth on 6/22/14. */ public class SimpleHub implements JMessageHub { //消息类型->订阅了这个类型的消息的所有订阅者 private HashMap<Class<?>, ArrayList<JMessageReceiver>> mapHandlers; //初始化 public SimpleHub() { mapHandlers = new HashMap<>(); } //发布 @Override public <TMessage extends JMessage> void publish(Class<TMessage> messageClass, TMessage message) { // we can do nothing if no subscribers are available // 向某个消息类型发布一条消息. 首先要确保消息类型有订阅者 if (mapHandlers.containsKey(messageClass)) { //取出所有订阅了这种类型的消息的订阅者 ArrayList<JMessageReceiver> list = mapHandlers.get(messageClass); for (JMessageReceiver rec : list) { //同步回调 //所以订阅者都要事先JMessageReceiver的notifyReceiver方法. rec.notifyReceiver(message); } } } //订阅 @Override public <TMessage extends JMessage, TRec extends JMessageReceiver<TMessage>> JMessageToken<TMessage> subscribe(Class<TMessage> messageClass, TRec handler) { ArrayList<JMessageReceiver> list; if (mapHandlers.containsKey(messageClass)) { list = mapHandlers.get(messageClass); } else { //第一个订阅者 list = new ArrayList<>(); list.add(handler); } mapHandlers.put(messageClass, list); //返回封装了消息类型和订阅者具体实现类的Token return new JMessageToken<TMessage>(handler, messageClass); } @Override public <TMessage extends JMessage> void unsubsribe(JMessageToken<TMessage> token) { if (mapHandlers.containsKey(token.getMessageClass())) { ArrayList<JMessageReceiver> list = mapHandlers.get(token.getMessageClass()); list.remove(token.getHandler()); } } }