编程中大量if-elseif替换解决办法

实现目标:利用接口编程,接口有不同的实现,然后直接利用接口进行分发就行了,避免写大段的if-elseif语句,如果可选比较多,如果都写成if-elseif就显得非常不优雅,而且同一个方法也会特别臃肿。我有两种实现的想法,第一种是利用反射机制,代码示例:

public void receive(String message) {
        LOGGER.info("接收到来自spider_queue队列的消息:" + message);
        // TODO: 2018/12/26 先去redis里面判断该message是否已经存在了,而且是没有执行完的,执行完了就会删除,这样也不会造成后续的问题
        boolean check = redisService.isMessageCache(message);
        if (!check){
            try {
                Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message);
                Integer messageId = CastUtil.toInteger(messagemap.get("msgid"));
                // TODO: 2018/12/26 如何实现消息分发功能 尝试1: 通过反射机制实现
                Class clz = Class.forName(Consts.msgHandlerMap.get(messageId));
                Object obj = clz.newInstance();
                Method m = obj.getClass().getDeclaredMethod("handle", String.class);
                m.invoke(obj, messagemap);
            }catch (Exception e){
                // TODO: 2018/12/26 向web发送消息不合法

            }
        }else {
            // TODO: 2018/12/26 向web端返回不要重复发送 message 的指令
        }
    }

//
public class Consts {
    // msgId -> className
    public static final Map<Integer, String> msgHandlerMap = new HashMap<Integer, String>(){
        {
            put(MessageType.PROJECT_MESSAGE.getCode(), "com.shengqian.spider.handler.PaChongHandler");
        }
    };


}

或使用接口的方式:

public void receive(String message) {
        LOGGER.info("接收到来自spider_queue队列的消息:" + message);
        // TODO: 2018/12/26 先去redis里面判断该message是否已经存在了,而且是没有执行完的,执行完了就会删除,这样也不会造成后续的问题
        boolean check = redisService.isMessageCache(message);
        if (!check){
            try {
                Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message);
                Integer messageId = CastUtil.toInteger(messagemap.get("msgid"));
                // TODO: 2018/12/26 如何实现消息分发功能 尝试1: 通过反射机制实现
                Class clz = Class.forName(Consts.msgHandlerMap.get(messageId));
                Object obj = clz.newInstance();
                if (obj instanceof BaseHandler){
                    ((BaseHandler) obj).handle(messagemap);
                }
            }catch (Exception e){
                // TODO: 2018/12/26 向web发送消息不合法

            }
        }else {
            // TODO: 2018/12/26 向web端返回不要重复发送 message 的指令
        }
    }

另外一种办法是在map里面放入实例:

public static final Map<Integer, BaseHandler> msgHandlerMap = new HashMap<Integer, BaseHandler>(){
        {
            put(MessageType.PROJECT_MESSAGE.getCode(), new PaChongHandler());
        }
    };
//

public void receive(String message) {
        LOGGER.info("接收到来自spider_queue队列的消息:" + message);
        // TODO: 2018/12/26 先去redis里面判断该message是否已经存在了,而且是没有执行完的,执行完了就会删除,这样也不会造成后续的问题
        boolean check = redisService.isMessageCache(message);
        if (!check){
            try {
                Map<String, Object> messagemap = (Map<String, Object>) JSON.parse(message);
                Integer messageId = CastUtil.toInteger(messagemap.get("msgid"));
                // TODO: 2018/12/26 如何实现消息分发功能 尝试1: 通过反射机制实现
//                Class clz = Class.forName(Consts.msgHandlerMap.get(messageId));
//                Object obj = clz.newInstance();
//                if (obj instanceof BaseHandler){
//                    ((BaseHandler) obj).handle(messagemap);
//                }
                // TODO: 2018/12/26 尝试2 在map里面放实例
                Consts.msgHandlerMap.get(messageId).handle(messagemap);
            }catch (Exception e){
                // TODO: 2018/12/26 向web发送消息不合法

            }
        }else {
            // TODO: 2018/12/26 向web端返回不要重复发送 message 的指令
        }
    }

这样就可以用一行代码解决大段的if-elseif了

最后贴一个用spring 进行管理的办法,
在这里插入图片描述
这个是我第一天下班向公司的leader请教了之后,leader第二天发给我的版本,用spring 来进行管理,这样在开发中能够使得资源更加合理化。

猜你喜欢

转载自blog.csdn.net/xielinrui123/article/details/85266143