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

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

前一段时间,闲着无聊玩微信开发,遇到一个问题:当关注者向公众号发送消息,请求一些服务时,由于是文本消息,所以当公众号拿到消息内容时,必须判断消息以什么打头,即:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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曾经说过,上天不会这么惩罚一个后期维护代码的人,所以答案是勘定有,今天老夫就给大家带来一个解决方法,需要说明的是:这不是老夫的原创,是老夫研究捷微源码的找到的方法,老夫在捷微方法的基础上做了一些修改,所以先感谢捷微,感谢捷微的开发人员。最后需要说明的是,这个方法也不是很完善,如果有人参考的话,老样子,请做具体修改,但逻辑老夫保证不会有错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
@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.

请输入正确的验证码