策略模式+Spring配置类优化多if..else思路

这篇具有很好参考价值的文章主要介绍了策略模式+Spring配置类优化多if..else思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图示

策略模式+Spring配置类优化多if..else思路

1. 现状

场景: 假设设备上报不同类型的消息,我们要对不同类型的消息做不同的处理。如果我们通过if..else的方式处理的话会显得比较冗余。

例如:

if("alarmEvent".equals(msg)){
    // 处理告警消息逻辑 ...
}else if("deviceBase".equals(msg)){
    // 处理设备上报的基本信息 ...
}else if("heartBeat".equals(msg)){
    // 处理设备心跳消息 ...
}else {
    // ...
}

2. 消息处理Handler

那么对于不同消息的不同的处理逻辑我们可以单独放在一个实现类中,这些类有着相同的行为,所以我们可以定义一个接口:

public interface MessageHandler<T>{
    T invoke(String bizUpMessage); // 处理接收到的消息
    String getName();
    String getIdentification(); // 获取消息标志
}

针对于不同的消息,我们可以有各自的实现

实现类1:

@Component
public class DeviceBaseInfoHandler implements MessageHandler<String> {

    @Override
    public String invoke(String bizUpMessage) {
        // 处理设备上报的基本信息 ...
        return "";
    }

    @Override
    public String getName() {
        return "";
    }

    @Override
    public String getIdentification() {
        return "DeviceBaseInfoRequest";
    }
}

实现类2:

@Component
public class AlarmEventHandler implements MessageHandler<String>{

    @Override
    public String invoke(String bizUpMessage) {
       // 处理告警信息 ...
        return null;
    }

    @Override
    public String getName() {
        return "";
    }

    @Override
    public String getIdentification() {
        return "AlarmEventRequest";
    }
}

3. Handler注册处

我们可以将上一步的消息处理对象,根据消息的标志(Identification)不同,将消息放在一个Map中:

public class MessageHandlerRegisty {

    private Map<String, List<MessageHandler>> registerMap = new HashMap<>();

    // 注册各种 handler
    public void regist(String identification, MessageHandler handler){
        if(this.contains(identification)){
            get(identification).add(handler);
        } else {
            List<MessageHandler> list = new ArrayList<>();
            list.add(handler);
            registerMap.put(identification, list);
        }
    }

    public boolean contains(String identification){
        return registerMap.containsKey(identification);
    }

    public List<MessageHandler> get(String identification){
        return registerMap.get(identification);
    }
}

4. 消息接收Service

消息接收接口

public interface IMessageService {
    void messageReceived(String bizUpMessage); // 接收消息
}

5. 消息接收ServiceImpl

消息接收实现类文章来源地址https://www.toymoban.com/news/detail-609003.html

public class MessageServiceImpl implements IMessageService{
    
    public MessageHandlerRegisty registy;
    
    // 线程池
    public ExecutorService executorService = new ThreadPoolExecutor(3, 10, 15, TimeUnit.MINUTES, new LinkedBlockingQueue(1000), new LogdDiscardPolicy());
    
    public void messageReceived(String bizUpMessage){
        
        // 获取消息的标志Identification
        String identification = extractIdentification(bizUpMessage);
        
        if(StringUtils.isBlank(identification)){ 
            return;
        }
        
        if(!registy.contains(identification)){  
            return;
        }
        
        for(MessageHandler handler : registy.get(identification)){
            execute(handler, bizUpMessage); // 多线程处理消息
        }
    }
    
    public MessageHandlerRegisty getRegisty() {
        return registy;
    }
    public void setRegisty(MessageHandlerRegisty registy) {
        this.registy = registy;
    }
    
    private void execute(MessageHandler handler, String bizUpMessage){
        executorService.submit(new IotMessageTask(handler, bizUpMessage));
    }
    
    public final class LogdDiscardPolicy extends ThreadPoolExecutor.DiscardPolicy {
        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            log.warn("MessageService pool is full !!!!!!!!");
        }
    }
    
    
    final class IotMessageTask implements Runnable {

        private MessageHandler handler;
        private String bizUpMessage;

        public IotMessageTask(MessageHandler handler, String bizUpMessage){
            this.handler = handler;
            this.bizUpMessage = bizUpMessage;
        }

        @Override
        public void run() {
            try {
                Stopwatch stopwatch = Stopwatch.createStarted();
                handler.invoke(bizUpMessage);
                stopwatch = stopwatch.stop();
                
                long cost = stopwatch.elapsed(TimeUnit.MICROSECONDS);
                logTime(cost);
            }catch (Exception e){
                log.error("handler execute error - ", e);
            }
        }

        private void logTime(long cost){
            if(cost > 50){
                log.warn(" handler -> {}, cost too much -> {}", handler.getName(), cost);
            } else {
                log.info("handler -> {}, cost -> {}", handler.getName(), cost);
            }
        }
        
    }

    
    
}

6. 将MessageServiceImpl对象配置到spring容器

@Configuration
public class ManagerConfig {

    @Bean
    public IMessageService messageService(){
        MessageServiceImpl messageService = new MessageServiceImpl();
        messageService.setRegisty(buildRegisty());
        return messageService;
    }

    // 消息处理handler
    @Autowired
    private DeviceBaseInfoHandler deviceBaseInfoHandler;
    @Autowired
    private AlarmEventHandler alarmEventHandler;
    
    private MessageHandlerRegisty buildRegisty(){
        MessageHandlerRegisty registy = new MessageHandlerRegisty();
        registy.regist(deviceBaseInfoHandler.getIdentification(), deviceBaseInfoHandler);
        registy.regist(alarmEventHandler.getIdentification(),alarmEventHandler);
        
        return registy;
    }
}

到了这里,关于策略模式+Spring配置类优化多if..else思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之【策略模式】,去掉繁琐的if-else,实现算法的动态替换

    全网最全最细的【设计模式】总目录,收藏起来慢慢啃,看完不懂砍我 策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),它是将定义的算法家族分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。属于行为型模式。 策略模式使用

    2024年02月09日
    浏览(44)
  • Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

     前言:在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿,这边我就举一个我在实际开发中的例子,来进行阐述这两种模式在实际开发中我是如何运用的。 目录 一、工厂模式简介 二、简单工厂模式 2.1、UML类图

    2024年02月15日
    浏览(34)
  • C++类模板实现工厂模式(优化if else/switch case)

    引自:https://blog.csdn.net/weixin_43795921/article/details/127224633 template typename IdentifierType, class AbstractProduct, class ProductCreator = AbstractProduct *(*)(), class MapContainer = std::mapIdentifierType, ProductCreator class Factory { public: bool Register(const IdentifierType id, ProductCreator creator) { return producers_.insert(std::make

    2024年02月13日
    浏览(55)
  • 设计模式:干掉if else的几种方法

    存在的问题: 如果业务逻辑过多 if else 可能要写多达几百行,这样代码可读性很差,不利于寻找bug和理解代码 如果if后面的判断逻辑过长,则代码可读性不强 如果将其写在一个核心代码里面,则新增功能时需要修改核心代码,要是不小心改到其他的代码就凉凉了 当业务逻辑

    2024年02月07日
    浏览(41)
  • 【状态模式】拯救if-else堆出来的屎山代码

    我想大家平时都在开发重都遇见过屎山代码,这些屎山代码一般都是由于复杂且庞大的if-else造成的,状态模式,是一种很好的优化屎山代码的设计模式,本文将采用两个业务场景的示例来讲解如何使用状态模式拯救屎山代码。 目录 前言 1.网购业务场景 1.1.需求 1.2.if else的实

    2024年02月12日
    浏览(40)
  • springboot工厂模式解决if_else流程和问题点解决

    spring中的Bean由IOC容器进行管理,和普通工厂的区别就是springboot中的类不能通过自己New出来使用,如果通过new写入到工厂,涉及到相关实现类调用其他Service(该service在正确情况下正常注入),注入的Service也会报错异常Null,也就是工厂注入失败。 工厂中的相关Bean也通过Spring

    2023年04月09日
    浏览(65)
  • 设计模式第八讲:常见重构技巧 - 去除多余的if else

    最为常见的是代码中使用很多的if/else,或者switch/case;如何重构呢?方法特别多,本文是设计模式第八讲,带你学习其中的技巧。 通常业务代码会包含这样的逻辑:每种条件下会有不同的处理逻辑。比如两个数a和b之间可以通过不同的操作符(+,-,*,/)进行计算,初学者通

    2024年02月10日
    浏览(41)
  • Springboot实现优雅的参数校验(Spring Validation)和 if else说再见

    当我们想提供可靠的 API 接口,对参数的校验,以保证最终数据入库的正确性,是 必不可少 的活。比如下图就是 我们一个项目里 新增一个菜单校验 参数的函数,写了一大堆的 if else 进行校验,非常的不优雅,比起枯燥的CRUD来说,参数校验更是枯燥。这只是一个创建菜单的

    2023年04月15日
    浏览(39)
  • 一些性能优化思路与策略

    今天公司同事做技术分享,题目就是:一些性能优化思路与策略,我学习了一下然后做了如下总结。 响应时间:平均响应时间,TP95、TP99等等。这里需要注意,响应时间有服务端响应时间和客户端响应时间的区别,一般关注服务端的相应时间。 吞吐量:QPS、TPS 系统负载:并发

    2024年02月16日
    浏览(50)
  • 【自学Java】Java if else-if else语句

    在 Java 语言 中, if 是用于测试某个条件( 布尔型 或逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行 if 后由大括号 {} 括起来的代码块,否则就忽略该代码块继续执行后续的代码。 else if 用于在 if 语句条件不满足的情况下,继续执行 else

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包