项目开发-微信公众号被动响应消息处理

       过去参与的一个微信公众号开发的项目,其中处理被动响应消息的类相对臃肿,原因是该项目需要处理的消息类型较多,通过switch分支,分支方法都写在一个类里面。功能完成后,这个类就巨大无比了。闲来无事,就在想应该怎么重构一下呢?设计模式里面有解决大量if分支的状态模式,但是模式应用还没看明白。

      想来,还是switch最直观的,为了便于维护,有必要把每个分支都抽取成一个处理类,同时做好包结构规划,虽然会形成大量短小的消息处理类,但是整体结构是清晰的。简单整理了下代码,类图如下:


     原来全部代码都是写在RequestDispatcher里面的,现在则把其转化成N个短小的消息处理类,具体处理普通消息和事件消息。

/**
 * 根据消息类型转发给对应的消息处理类
 * @title RequestDispatcher
 * @author WoodWang
 * @description
 * @date   2015-5-18
 * @version 1.1.0
 */
public class RequestDispatcher {
	public ResponseMsg doDispatcher(RequestMsg request){
		//事件消息
		if ("event".equals(request.getMsgType())) {
			return dispatchEvent(request);
		}
		
		//普通消息
		return dispatchMessage(request);
	}
	
	private ResponseMsg dispatchEvent(RequestMsg request){
		ResponseMsg response = null;
		EventType eventType = EventType.getEventType(request.getMsgType());
		//根据事件类型,创建不同的处理类
		switch(eventType){
		case subscribe:
			response = new SubscribeEventHandler().onEvent(request);
			break;
		case unsubscribe:
			break;
		case SCAN:
			break;
		}
		return response;
	}
	
	private ResponseMsg dispatchMessage(RequestMsg request){
		ResponseMsg response = null;
		MsgType msgType = MsgType.getMsgType(request.getMsgType());
		//根据消息类型,创建不同的处理类
		switch(msgType){
		case text:
			response = new TextMsgHandler().onMsg(request);
			break;
		case image:
			response = new ImageMsgHandler().onMsg(request);
			break;
		case link:
			//TODO 
		case location:
			//TODO 
		case video:
			//TODO 
		case voice:
			//TODO 
		}
		return response;
	}
}
      每个具体消息处理类,遵循单一职责原则,完成一种消息的处理,例如TextMsgHandler:

public class TextMsgHandler {
	/**
	 * 文本消息,响应格式为XML的文本信息
	 * @param msg
	 * @return
	 */
	public ResponseMsg onMsg(RequestMsg msg){
		ResponseMsg response = null;
		//TODO 解析请求消息内容,处理并返回
		return response;
	}
}
       从最初的只关注功能实现,到开始关注代码结构、可读性,会考虑代码的执行效率,算不算是Coder的一个成熟表现呢?

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值