首页 > 微信 > 反射的简单应用:解决微信开发中if-else过多的问题

反射的简单应用:解决微信开发中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
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: 微信 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

请输入正确的验证码