• Springboot中实现策略模式+工厂模式


      策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在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;
    
    /**
     * @author huangqingshi
     * @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;
    
    /**
     * @author huangqingshi
     * @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;
    
    /**
     * @author huangqingshi
     * @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。后续如果有新策略的话,直接实现即可。

      好了,这块就这么完成了,你get到了吗?

      代码地址:https://github.com/stonehqs/pattern.git

      欢迎拍砖~

  • 相关阅读:
    遗传算法python实现
    lambda的一些用法
    Python遗传和进化算法框架(一)Geatpy快速入门
    电脑连接小爱同学音箱无法调节音量
    Shell脚本批量修改文件编码为UTF-8
    java实现 批量转换文件编码格式为UTF8
    POM添加规范
    SOFA框架跨包调用报错NoClassDefFoundError
    logger打印日志时加if (logger.isInfoEnabled())/if (logger.isDebugEnabled())
    对象,JSON,字符串,map之间的互转
  • 原文地址:https://www.cnblogs.com/huangqingshi/p/10344265.html
Copyright © 2020-2023  润新知