前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >if-else的另一种实现

if-else的另一种实现

作者头像
OPice
发布2019-10-23 17:49:10
3610
发布2019-10-23 17:49:10
举报
文章被收录于专栏:D·技术专栏D·技术专栏

背景

在日常开发中,经常会需要监听某种数据的新增、删除、修改。根据不同类型做处理,通常处理:

代码语言:javascript
复制
public interface MqService {
    /**
     * 处理mq消息
     *
     * @param mqMessageDTO
     * @return
     */
    Boolean handlerMsg(MQMessageDTO mqMessageDTO);
}

@Service
@Slf4j
public class MqServiceImpl implements MqService {
    @Override
    public Boolean handlerMsg(MQMessageDTO mqMessageDTO) {
        try {
            if (MQMessageDTO.MsgType.INSERT == mqMessageDTO.getMsgType()) {
               // 处理新增数据
            } else if (MQMessageDTO.MsgType.UPDATE == mqMessageDTO.getMsgType()) {
               //处理修改数据
            } else if (MQMessageDTO.MsgType.DELETE == mqMessageDTO.getMsgType()) {
               //处理删除数据
            }
            return true;
        } catch (Exception e) {
            log.error("消息消费失败:{}", mqMessageDTO);
            e.printStackTrace();
            return false;
        }
    }
}

这样如果类型较多会有大量if-else分支逻辑,我们可以换一种模式实现

定义三个不同类型的Handler

代码语言:javascript
复制
@Component
@HandlerAnnotation(MQMessageDTO.MsgType.DELETE)
public class DeleteHandler extends AbstractHandler {
    @Override
    public void handler() {
        System.out.println("收到删除消息");
    }
}
@Component
@HandlerAnnotation(MQMessageDTO.MsgType.INSERT)
public class InsertHandler extends AbstractHandler {
    @Override
    public void handler() {
        System.out.println("收到新增消息");
    }
}
@Component
@HandlerAnnotation(MQMessageDTO.MsgType.UPDATE)
public class UpdateHandler extends AbstractHandler {
    @Override
    public void handler() {
        System.out.println("收到更新消息");
    }
}

定义一个注解,根据注解来调用哪个handler处理

代码语言:javascript
复制
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface HandlerAnnotation {
    MQMessageDTO.MsgType value();
}

工厂初始化的时候,注册HandlerContext

代码语言:javascript
复制
@Data
public class HandlerContext {
    private Map<String, Object> handlerMap;

    public HandlerContext(Map<String, Object> handlerMap) {
        this.handlerMap = handlerMap;
    }
}


@Component
public class HandlerProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        Map<String, Object> beansWithAnnotation = configurableListableBeanFactory.getBeansWithAnnotation(HandlerAnnotation.class);
        Map<String, Object> typeHandler = Maps.newHashMap();
        beansWithAnnotation.keySet().forEach(beanName -> {
            MQMessageDTO.MsgType value = beansWithAnnotation.get(beanName).getClass().getAnnotation(HandlerAnnotation.class).value();
            typeHandler.put(value.name(),beansWithAnnotation.get(beanName));
        });
        HandlerContext handlerContext = new HandlerContext(typeHandler);
        configurableListableBeanFactory.registerResolvableDependency(HandlerContext.class, handlerContext);
    }
}

替换过的实现

代码语言:javascript
复制
@Service
@Slf4j
public class MqServiceImpl implements MqService {
    @Autowired
    private HandlerContext handlerContext;

    @Override
    public Boolean handlerMsg(MQMessageDTO mqMessageDTO) {
        try {
            /*if (MQMessageDTO.MsgType.INSERT == mqMessageDTO.getMsgType()) {
               // 处理新增数据
            } else if (MQMessageDTO.MsgType.UPDATE == mqMessageDTO.getMsgType()) {
               //处理修改数据
            } else if (MQMessageDTO.MsgType.DELETE == mqMessageDTO.getMsgType()) {
               //处理删除数据
            }*/
            Map<String, Object> handlerMap = handlerContext.getHandlerMap();
            AbstractHandler handler = (AbstractHandler)handlerMap.get(mqMessageDTO.getMsgType().name());
            handler.handler();
            return true;
        } catch (Exception e) {
            log.error("消息消费失败:{}", mqMessageDTO);
            e.printStackTrace();
            return false;
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.09.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档