美文网首页
消息通知泛型版

消息通知泛型版

作者: 天地一蜉蝣_6e86 | 来源:发表于2020-05-12 15:59 被阅读0次

    最近在做一个项目,项目内部需要使用消息通知系统,由于只是单机内部消息通知,使用类似kafka这样的消息队列就太重量级了。所以设计了一个简单的消息通知功能。
    这个消息通知功能使用观察者模式,但是消息有多中类型,我需要根据不同的消息类型来选择合适的handler。因此我想到了泛型,我们可以通过泛型来确定哪个handler 适合处理什么消息
    首先我们需要创建一个interface 或者抽象类 Handler<T>。handler 需要声明自己能够处理的消息类型。
    public abstract class Handler<T> {
    abstract void handle(T t);
    }
    我们可以通过反射来获取handler 实例的泛型类型
    Type genType = h.getClass().getGenericSuperclass();
    Type params = ((ParameterizedType)genType).getActualTypeArguments()[0];
    基于这个思路,来开发生下部分
    定义基本消息
    public class Base {
    }
    具体消息都继承Base。
    public class Son extends Base {
    }
    在定义消息的handler
    public class SonHandler extends Handler<Son> {
    @Override
    void handle(Son son) {
    System.out.println(son);
    }
    }

    public class StringHandler extends Handler<String> {
    @Override
    void handle(String s) {
    System.out.println(s);
    }
    }
    两个handler 分别处理字符串类型和Son 类型。
    定义watcher。
    public class Watcher {
    private Multimap<Type,Handler> multimap =ArrayListMultimap.create();
    public void register(Handler h){

    Type genType = h.getClass().getGenericSuperclass();
    Type params = ((ParameterizedType)genType).getActualTypeArguments()[0];
    multimap.put(params,h);
    

    }
    public Collection<Handler> getHandler(Class c){
    return multimap.get(c);
    }
    }
    这里使用了guava 的Multimap。
    这就完成了最基本的消息分发功能。该功能是对观察者模式的改进,可以通过泛型选择消息的handler

    相关文章

      网友评论

          本文标题:消息通知泛型版

          本文链接:https://www.haomeiwen.com/subject/oswbnhtx.html