Springboot中实现策略模式+工厂模式的方法

 更新时间:2022年03月11日 09:59:51   作者:JUST DO IT  
这篇文章主要介绍了Springboot中实现策略模式+工厂模式,具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE....,接下来咱们直接实现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

到此这篇关于Springboot中实现策略模式+工厂模式的文章就介绍到这了,更多相关Springboot策略模式工厂模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot 1.5.7整合Kafka-client代码示例

    Springboot 1.5.7整合Kafka-client代码示例

    这篇文章主要介绍了Springboot 1.5.7整合Kafka-client代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Spring之Scope注解使用详解

    Spring之Scope注解使用详解

    spring的bean管理中,每个bean都有对应的scope。在BeanDefinition中就已经指定scope,默认的RootBeanDefinition的scope是prototype类型,使用@ComponentScan扫描出的BeanDefinition会指定是singleton,最常使用的也是singleton
    2023-02-02
  • SpringBoot使用@Autowired为多实现的接口注入依赖

    SpringBoot使用@Autowired为多实现的接口注入依赖

    这篇文章主要介绍了SpringBoot使用@Autowired为多实现的接口注入依赖,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • mybatis使用foreach踩坑及解决

    mybatis使用foreach踩坑及解决

    这篇文章主要介绍了mybatis使用foreach踩坑及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 深度deepin安装以及jdk、tomcat、Nginx安装教程

    深度deepin安装以及jdk、tomcat、Nginx安装教程

    这篇文章主要给大家介绍了关于深度deepin安装以及jdk、tomcat、Nginx安装的相关资料,按照文中介绍的方法可以轻松的实现安装,对大家的工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • SpringBoot实现多数据源的实战案例

    SpringBoot实现多数据源的实战案例

    这篇文章主要介绍了SpringBoot实现多数据源的实战案例,文中通过示例代码和图文展示介绍的非常详细,对大家的学习或工作有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2024-01-01
  • 2020 IDEA安装教程与激活(idea2020激活码)

    2020 IDEA安装教程与激活(idea2020激活码)

    这篇文章主要介绍了2020 IDEA安装教程与激活(idea2020激活码),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • java清除html转义字符

    java清除html转义字符

    这篇文章主要介绍了一个静态文件处理的一些便捷服务,包括 java清除html转义字符,清除html代码,从style样式中读取CSS的属性,将字符串截取指定长度,涉及log4j,common-lang类的学习
    2014-01-01
  • Java日常练习题,每天进步一点点(54)

    Java日常练习题,每天进步一点点(54)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • myatisplus的saveOrUpdate的提交总是update问题

    myatisplus的saveOrUpdate的提交总是update问题

    这篇文章主要介绍了myatisplus的saveOrUpdate的提交总是update问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论