示例工程代码
可从附件下载
具体的说明和用法在后面介绍
需求与目的
一个游戏服务端需要处理各种业务逻辑,每一种业务逻辑都对应着一个请求消息和一个响应消息。那么服务端需要把这些不同的消息自动分发到对应的业务逻辑中处理。
最简单的处理方式就是根据请求消息中的type字段,使用switch case来进行分别处理,但这种方式随着消息的增多,显现了一些坏味道:长长的一大坨不太好看;如果要添加新的消息、新的逻辑,或者去掉新的消息、新的逻辑,在代码上不但要修改这些消息和逻辑,还不得不修改这长长的一坨swtich case,这样的修改显得很多余。
所以我们的目的就是把消息分发这块的代码自动化,在增加、修改、删除消息和逻辑的时候不需要再对消息分发的代码再做修改,从而使得修改的代码最小化。
实现原理
在实现中,使用了注解(annotation)
package com.company.game.dispatcher.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 修饰消息类和业务逻辑执行类
* msgType指定对应的类型,从1开始计数
* @author xingchencheng
*
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserMsgAndExecAnnotation {
short msgType();
}
唯一的字段msgType代表了消息类型,这是客户端与服务端的约定,这里我们从1开始计数。
当我们要增加一个加法消息时,就使用这个注解来修饰我们的请求消息类:
package com.company.game.dispatcher.msg;
import com.company.game.dispatcher.annotation.UserMsgAndExecAnnotation;
/**
* 加法请求消息类
*
* @author xingchencheng
*
*/
@UserMsgAndExecAnnotation(msgType = MsgType.ADD)
public class UserAddRequest extends RequestMsgBase {
private double leftNumber;
private double RightNumber;
public UserAddRequest() {
super(MsgType.ADD);
}
public double getLeftNumber() {
return leftNumber;
}
public void setLeftNumber(double leftNum