• Spring Boot 实现策略模式


    转载自 微信公众号 [Java大后端]

    策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式?

    具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE....。接下来咱们直接实现,项目结构图:

     工厂类FactoryStrategy负责创建策略的工厂,代码比较简单,比较关键的一点是AutoWired一个Map<String, Strategy> 这个会在初始化的时候将所有的Strategy自动加载到Map中,是不是很方便。使用concurrentHashMap是防止多线程操作的时候出现问题。同时还要注意@Service注解。

    package com.hqs.pattern.factory;
    
    import com.hqs.pattern.strategy.Strategy;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    
    /**
     * @Date 2019-01-31
     */
    @Service
    public class FactoryForStrategy {
    
        @Autowired
        Map<String, Strategy> strategys = new ConcurrentHashMap<>(3);
    
        public Strategy getStrategy(String component) throws Exception{
            Strategy strategy = strategys.get(component);
            if(strategy == null) {
                throw new RuntimeException("no strategy defined");
            }
            return strategy;
        }
    
    }

    接下来就是Strategy接口,就一个doOperation方法。

    package com.hqs.pattern.strategy;
    
    /**
     * @Date 2019-01-31
     */
    public interface Strategy {
    
        String doOperation();
    
    }

    定义接口的实现,我定义了三个, 都类似,这里我就放出一个来吧。Component里边的one是指定其名字,这个会作为key放到Map strategys里边。

    package com.hqs.pattern.strategy.impl;
    
    import com.hqs.pattern.strategy.Strategy;
    import org.springframework.stereotype.Component;
    
    /**
     * @Date 2019-01-31
     */
    @Component("one")
    public class StrategyOne implements Strategy {
        @Override
        public String doOperation() {
            return "one";
        }
    }

    好了,写一个Controller类,用于进行测试,当然我还是使用swagger,使用swagger的时候有个细节,就是注意生产上一定不能打开,否则是个非常可怕的事情。

    package com.hqs.pattern.controller;
    
    import com.hqs.pattern.factory.FactoryForStrategy;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * @author huangqingshi
     * @Date 2019-01-31
     */
    @Controller
    public class StrategyController {
    
        @Autowired
        FactoryForStrategy factoryForStrategy;
    
        @PostMapping("/strategy")
        @ResponseBody
        public String strategy(@RequestParam("key") String key) {
            String result;
            try {
                result = factoryForStrategy.getStrategy(key).doOperation();
            } catch (Exception e) {
                result = e.getMessage();
            }
            return result;
        }
    
    
    }

    打开swagger进行测试,输入one,返回one。输入four,返回no strategy defined。后续如果有新策略的话,直接实现即可。

  • 相关阅读:
    django学习-33.【一对多】表关系对应的完整业务操作
    django学习-32.发送满足【邮件正文值为一个html页面+有多个附件】的单个邮件
    django学习-31.发送满足【邮件正文值为一个html页面】的单个邮件
    东芝TC10 512G使用半年后掉速严重
    添加Linux服务(Debian 8+,Systemd)
    C# LinkedList
    在VS2019里面 C# 和SqlSerer的勾兑
    Jquery垂直下拉二级菜单
    (二十六)运输层--TCP的拥塞控制的一般原理
    (二十五)运输层--TCP的流量控制
  • 原文地址:https://www.cnblogs.com/no-celery/p/14718186.html
Copyright © 2020-2023  润新知