策略模式是一种常见的设计模式,用于封装不同的算法,并使其可以相互替换。在这篇文章中,我们将介绍如何优雅地使用策略模式来实现更灵活、可扩展和易于维护的代码。
1. 定义接口。
/**
* 信息处理类
* @author wangkeyao
*/
public interface IMessageHandler {
/**
* 统一处理信息接口
* @param requestMap
* @return
*/
String handle(Map<String, String> requestMap);
/**
* 匹配走哪个消息处理
* @param requestMap
* @return
*/
boolean getMatched(Map<String, String> requestMap);
}
2. 实现类,并注册为 Bean。
/**
* 文本信息
* @author wangkeyao
*/
@Slf4j
@Service
public class TextMessageHandler implements IMessageHandler {
@Override
public String handle(Map<String, String> requestMap) {
return WeChatUtil.sendTextMsg(requestMap, "您发送的是文本消息!",true);
}
@Override
public boolean getMatched(Map<String, String> requestMap) {
String msgType = requestMap.get(WeChatContant.MsgType);
log.info("\n消息类型:{}", msgType);
return WeChatContant.REQ_MESSAGE_TYPE_TEXT.equals(msgType);
}
}
/**
* 关注
* @author wangkeyao
*/
@Slf4j
@Service
public class FollowMessageHandler implements IMessageHandler {
@Resource
private IWeChatMPService weChatMPService;
@Override
public String handle(Map<String, String> requestMap) {
String openId = requestMap.get("FromUserName");
String appId = requestMap.get("ToUserName");
weChatMPService.insertUser(openId, appId);
log.error(requestMap.toString());
return WeChatUtil.sendTextMsg(requestMap, "谢谢您的关注!",false);
}
@Override
public boolean getMatched(Map<String, String> requestMap) {
String msgType = requestMap.get(WeChatContant.MsgType);
if (!WeChatContant.REQ_MESSAGE_TYPE_EVENT.equals(msgType)) {
return false;
}
String eventType = requestMap.get(WeChatContant.Event);
log.info("\n事件类型为:{}", eventType);
return WeChatContant.EVENT_TYPE_SUBSCRIBE.equals(eventType);
}
}
3. 注入 Bean List,遍历使用。
// 接受事件推送
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class WeChatMPServiceImpl implements IWeChatMPService {
@Autowired
private List<IMessageHandler> messageHandlerList;
@Transactional
@Override
public String processRequest(HttpServletRequest request) {
// ... 其他逻辑
// 遍历消息实例找到对应的消息处理器
for (IMessageHandler messageHandler : messageHandlerList) {
if (messageHandler.getMatched(requestMap)) {
respXml = messageHandler.handle(requestMap);
break;
}
}
// ... 其他逻辑
}
}