反射的简单应用:解决微信开发中if-else过多的问题
前一段时间,闲着无聊玩微信开发,遇到一个问题:当关注者向公众号发送消息,请求一些服务时,由于是文本消息,所以当公众号拿到消息内容时,必须判断消息以什么打头,即:
String content = requestMap.get("Content").trim();
if ("?".equals(content) || "?".equals(content)) {
respContent = "您好,我是生活小助手,请根据提示,回复内容选择服务:nn1 回复“天气”获取天气帮助n2 回复“歌曲”获取歌曲帮助n3 回复“公交”获取歌曲帮助n4 回复“火车”获取歌曲帮助";
} else if (content.startsWith("歌曲")) {
//TODO
} else if (content.startsWith("天气")) {
//TODO
} else if (content.startsWith("物流")) {
//TODO
} else if (content.startsWith("公交")) {
//TODO
} else if (content.startsWith("火车")) {
//TODO
} else {
respContent = "亲,很抱歉,由于功能还不够完善,尚不能处理您回复的信息,请回复“?”显示主菜单,获取帮助,有此给您带来的不便,还请见谅!";
}
来判断何种服务,调用具体的接口来处理,当你的功能越来越完善时,会导致if-else越来越多,多的会自己都搞不清了,另外这个方法也会越来越大,显然不是非常符合面向对象的单一职责原则。那么有没用一个比较好的方法来解决这个问题呢?我曾经的项目经理Zack曾经说过,上天不会这么惩罚一个后期维护代码的人,所以答案是勘定有,今天老夫就给大家带来一个解决方法,需要说明的是:这不是老夫的原创,是老夫研究捷微源码的找到的方法,老夫在捷微方法的基础上做了一些修改,所以先感谢捷微,感谢捷微的开发人员。最后需要说明的是,这个方法也不是很完善,如果有人参考的话,老样子,请做具体修改,但逻辑老夫保证不会有错。
@Override
public BaseMessage handleText(String content, String fromUsername, String toUsername) {
String respContent = null;
BaseMessage baseMessage = null;
if ("?".equals(content) || "?".equals(content)) {
respContent = "您好,我是生活小助手,请根据提示,回复内容选择服务:nn1 回复“天气”获取天气帮助n2 回复“歌曲”获取歌曲帮助n3 回复“公交”获取公交帮助n4 回复“火车”获取火车帮助";
} else {
List<WeixinExpandconfigEntity> weixinExpandconfigEntities = new ArrayList<WeixinExpandconfigEntity>();
boolean isFind = false;// 是否找到关键字信息
for (WeixinExpandconfigEntity weixinExpandconfigEntity : weixinExpandconfigEntities) {
// 如果已经找到关键字并处理业务,结束循环。
if (isFind) {
break;// 如果找到结束循环
}
String[] keys = weixinExpandconfigEntity.getKeyword().split(",");
for (String k : keys) {
if (content.indexOf(k) != -1) {
String className = weixinExpandconfigEntity.getClassname();
String returnType = weixinExpandconfigEntity.getReturnType();
KeyService keyService = null;
try {
keyService = (KeyService) Class.forName(className).newInstance();
baseMessage = (BaseMessage) Class.forName(returnType).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
keyService.excute(baseMessage, content.substring(2));
isFind = true;
break;
}
}
}
}
if (baseMessage == null) {
TextMessage textMessage = new TextMessage();
textMessage.setContent(respContent);
baseMessage = textMessage;
}
baseMessage.setToUserName(fromUsername);
baseMessage.setFromUserName(toUsername);
baseMessage.setCreateTime(new Date().getTime());
baseMessage.setFuncFlag(0);
return baseMessage;
}
全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/68
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/68
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论