消息通知泛型版

2020-05-12  本文已影响0人  天地一蜉蝣_6e86

最近在做一个项目,项目内部需要使用消息通知系统,由于只是单机内部消息通知,使用类似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

上一篇下一篇

猜你喜欢

热点阅读