MsgHandler.java // 消息处理基类,但是本身又有一些方法
属性:
Map<Class<?>, MsgHandler> instances = new ConcurrentHashMap<>();
使用的地方
// 注意参数: Map中的key肯定是一个对象啊,因此这里肯定是一个实例化的对象。
public static <T extends MsgHandler> T getInstance(Class<?> clazz){
try{
Object inst = instances.get(clazz);
if(inst == null){
Constructor<?> constr = clazz.getDeclaredConstructor();
constr.setAccessible(true);
inst = constr.newInstance();
}
return (T) inst;
}catch(Exception e){
throw new SysException(e);
}
}
LoginService.java // 结合单例模式,创建一个消息派发服务
// 这是一个单例模式
public enum LoginService {
INSTANCE;
// 这里搞出来一个对象
private AccountMsgInstance m_msgInstance = MsgHandler.getInstance(AccountMsgInstance.class);
public void dispatchMessage(ClientSession session, ProtobufMessage message){
m_msgInstance.handle(message, "serv", this, "connId", session.getConnId(), "session", session);
}
}