重构消息处理机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重构消息处理机制相关的知识,希望对你有一定的参考价值。

没有重构前,代码了有多处n多if()else if() 这样的代码块,这样的代码可读性非常差,而且扩展的时候需要改动这些代码块,而且要修改的类的地方也非常多!包括这些代码快的类如下:

客户端从服务器端收到消息时的处理类:com.ansatsing.landlords.client.handler.ReceiveMessageHandler
   客户端发送消息到服务器端之前的消息包装类:com.ansatsing.landlords.client.handler.SendMessagePack

服务器从客户端收到消息时的消息处理类:com.ansatsing.landlords.server.socket.ServerMessageHandler,如果实现了Netty框架的话那netty包里也有这样一个类

重构后信息分类枚举类【com.ansatsing.landlords.entity.MsgType】就不要了,,还有一些信息标志常量也不要,常量如下
  
public  final static String SYSTEM_EXIT_MSG_FLAG = "SYSTEM_EXIT_MSG_FLAG";//客户端退出时发送这样的消息从而告诉服务器要把相应的线程停止。
public final static String USER_NAME_MSG_FLAG = "[email protected]";//用户名信息标志
public final static String ENTER_SEAT_MSG_FLAG = "ENTER_SEAT_MSG_FLAG";//霸占座位信息标志
public final static String EXIT_SEAT_MSG_FLAG = "EXIT_SEAT_MSG_FLAG";//空出座位信息标志
public final static String INIT_SEAT_MSG_FLAG = "INIT_SEAT_MSG_FLAG";//初始化座位信息标志
public final static String ENTER_ROOM_MSG_FLAG = "ENTER_ROOM_MSG_FLAG";//进入房间信息标志
public final static String EXIT_ROOM_MSG_FLAG = "EXIT_ROOM_MSG_FLAG";//退出斗地主房间信息标志
public final static String ROOM_SEND_ALL_MSG_FLAG = "ROOM_SEND_ALL_MSG_FLAG";//房间群发信息标志
public final static String ROOM_SEND_ONE_MSG_FLAG = "ROOM_SEND_ONE_MSG_FLAG";//房间私聊信息标志
public final static String ROOM_REMOVE_SOCKET_FLAG = "ROOM_REMOVE_SOCKET_FLAG";//牌友退出房间时移除牌友socket信息标志
public final static String ROOM_ADD_SOCKET_FLAG = "ROOM_ADD_SOCKET_FLAG";//牌友进入房间时添加牌友socket信息标志
public final static String GAME_READY_MSG_FLAG = "GAME_READY_MSG_FLAG";//游戏准备信息标志
public final static String GAME_DEAL_MSG_FLAG = "GAME_DEAL_MSG_FLAG";//游戏发牌信息标志+
public final static String SEND_CARDS_MSG_FlAG="SEND_CARDS_MSG_FlAG";//洗过的牌发送到客户端
public final static String GAME_ROB_MSG_FLAG = "SEND_ROB_MSG_FLAG";//("抢地主阶段发送抢地主情况给服务器的信息的标志");
public final static String START_READY_MSG_FLAG = "START_READY_MSG_FLAG";//启动游戏准备线程的信号标志
public final static String START_DEAL_MSG_FLAG = "START_DEAL_MSG_FLAG";//启动游戏发牌线程的信号标志
public final static String SET_ROLE_MSG_FLAG = "SET_ROLE_MSG_FLAG";//设置斗地主角色的信号标志
public final static String RESTART_READY_MSG_FLAG = "RESTART_READY_MSG_FLAG";//重启动游戏准备线程的信号标志
public final static String START_PLAY_MSG_FLAG = "START_PLAY_MSG_FLAG";//启动打牌线程的信号标志
public final static String PLAY_CARD_MSG_FLAG = "PLAY_CARD_MSG_FLAG";//游戏出牌的信号标志
public final static String GAME_OVER_MSG_FLAG = "GAME_OVER_MSG_FLAG";//一轮游戏结束的信号标志

这次重构主要用到技术java的反射机制,以及结合策略设计模式一起完成的!以后增加消息,比如qq斗地主踢人功能,那服务器端的消息处理线程以及客户端的消息处理线程都无需代码变动,只管在protocol包下增加所需的类!

这样真正实现程序的可扩展性,以及代码可读性!!!

以上是关于重构消息处理机制的主要内容,如果未能解决你的问题,请参考以下文章

如何重构这个 Java 代码片段

异常和TCP通讯

RabbitMQ确认机制问题处理

从Handler+Message+Looper源代码带你分析Android系统的消息处理机制

Java异常处理机制

求一个异步处理消息的方法