首页 > 其他分享 >Springboot整合策略模式概念->使用场景->优缺点->企业级实战

Springboot整合策略模式概念->使用场景->优缺点->企业级实战

时间:2023-01-17 18:00:15浏览次数:62  
标签:String 优缺点 企业级 算法 具体 Springboot seasons public 策略

一、前言

策略模式可能是在工作中使用最多的,也是在面试中最常提到的,代码重构和优化的必备! 小编之前也是一直说,其实没有真正的实战;最近有了机会实战了一下,来分享一下使用心得和在企业级的使用!

二、策略模式

1. 什么是策略模式

策略模式,英文全称是 Strategy Design Pattern。在 GoF 的《设计模式》一书中,它是这样定义的:

定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

2. 策略模式结构组成

  • Strategy:抽象策略类,一般为接口或者策略类
  • ConcreteStrategy:具体算法实现策略类
  • Context:环境或者上下文类,用于统一执行具体策略

其实以上三部分用白话文来解释就是: 需要一个接口和策略进行规范和约束接口和方法,这时需要一些具体的实现算法类去继承或者实现刚刚的接口和策略,最后通过一个环境或者上下文,也可以叫做工厂根据类型进行调用具体的算法!

3. 使用场景

  • 避免冗长的 if-else 或 switch 分支判断
  • 需要动态地在几种算法中选择一种
  • 对客户隐藏具体策略 (算法) 的实现细节,彼此完全独立,扩展其余不受影响

具体场景一般为:

  • 支付方式选择
  • 打折、满减方式选择
  • 根据类型调用不同的系统

4. 优缺点

优点:

  • 扩展性好
  • 符合开闭原则
  • 符合单一职责原则
  • 可读性好
  • 便于维护
  • 避免多层判断

缺点:

  • 策略过多,导致策略类
  • 对新手读代码不友好

三、策略模式实战

1. 实战例子

今天小编根据春夏秋冬四季需要做不同的事情来演示一下策略模式的使用方案; 需求是: 如果是春天,就要去放风筝 如果是夏天,就要去游泳 如果是秋天,就要去看枫叶 如果是冬天,就要去打雪仗 没有使用策略模式的话,肯定就是 if-if else进行实现! 下面就带大家体会一下具体使用哈!!

2. 策略接口

/**
 * 四季策略
 * @author wangzhenjun
 * @date 2022/12/1 9:30
 */
public interface SeasonsStrategy {

    /**
     * 根据季节去执行不同的方案
     * @param seasons
     * @return
     */
    String execute(String seasons);
}

3. 春季具体实现

/**
 * 春季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("spring")
public class SpringStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去放风筝吧!";
    }
}

4. 夏季具体实现

/**
 * 夏季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("summer")
public class SummerStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去游泳吧!";
    }
}

5. 秋季具体实现

/**
 * 秋季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("autumn")
public class AutumnStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去放看枫叶吧!";
    }
}

6. 冬季具体实现

/**
 * 冬季具体实现
 * @author wangzhenjun
 * @date 2022/12/1 9:34
 */
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("winter")
public class WinterStrategy implements SeasonsStrategy{
    @Override
    public String execute(String seasons) {

        return seasons + "来了!我们一起去打雪仗吧!";
    }
}

7. 上下文工厂实现

private Map<String, SeasonsStrategy> seasonsMap;这是最重要的,很多时候我们都知道怎么进行策略和实现怎么写,不知道怎么统一去放进去,来进行调用,可以自己放在map中。当然spring已经给我们组装好了,只要按需调用即可!

核心: ==Spring会自动将Strategy接口的实现类注入到这个Map中,key为bean id,value值则为对应的策略实现类!==

/**
 * 环境或者上下文类,用于统一执行具体策略
 * @author wangzhenjun
 * @date 2022/12/1 9:56
 */
@Component
public class SeasonsFactory {
    /**
     * Spring会自动将Strategy接口的实现类注入到这个Map中,key为bean id,value值则为对应的策略实现类
     */
    @Autowired
    private Map<String, SeasonsStrategy> seasonsMap;

    /**
     * 处理四季统一入口方法
     * @param seasons
     * @param beanName
     * @return
     */
    public String handle(String seasons,String beanName){
    	// 根据bean的名称获取对应的算法处理类
        SeasonsStrategy seasonsStrategy = seasonsMap.get(beanName);
        String execute = seasonsStrategy.execute(seasons);
        return execute;
    }
}

8. controller处理

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
	
    @Autowired
    private SeasonsFactory seasonsFactory;

    @GetMapping("/strategyTest/{seasons}/{beanName}")
    public Result strategyTest(@PathVariable("seasons") String seasons,@PathVariable("beanName") String beanName){
        String handle = seasonsFactory.handle(seasons, beanName);
        return Result.success(handle);
    }
}

9. 测试

http://localhost:8087/test/strategyTest/春天/spring 在这里插入图片描述 http://localhost:8087/test/strategyTest/夏天/summer 在这里插入图片描述

四、总结

在策略模式中定义了一系列算法,将每一个算法封装起来,并让它们可以相互替换,互不影响。

策略模式得益于按照开闭原则进行设计,各个具体算法按照单一职责原则设计; 提高了代码的复用性,对客户隐藏具体策略 (算法) 的实现细节,彼此完全独立,扩展其余不受影响;避免if-else 或 switch 分支语句判断;其缺点在于客户端必须知道所有的策略类,增加了系统中类的个数。

在日常开发一般用于消除多重判断,有时候不要为了用设计模式而用设计模式,一定要结合业务场景,过度设计也是很致命的!!

如果对你有帮助,还请不要吝啬您的发财小手,你的一键三连是我写作的动力,谢谢大家哈!!


可以看下小编的微信公众号,文章首发看,欢迎关注,一起交流哈!!

1ce70671ddf0285e86d99990fc347a9.jpg

标签:String,优缺点,企业级,算法,具体,Springboot,seasons,public,策略
From: https://blog.51cto.com/wangzhenjun/6017558

相关文章

  • VUE3企业级项目基础框架搭建流程(3)
    VUE-Routernpminstallvue-router@4安装完成后,在项目目录里新建一个router文件,我这里的用的是typeScript,所以建立的是router.ts,该文件是所有视图组件的映射。一般我......
  • 统一返回对象封装和统一异常捕获封装springboot starter
    好久没有更新文章了,高龄开发没什么技术,去了外包公司后没怎么更新文章了。今天分享下统一处理starter,相信开发web系统的时候都是会涉及到前后端的交互,而后端返回数据的时候......
  • SpringBoot 拦截器 & 过滤器
    拦截器Java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种......
  • Springboot之OncePerRequestFilter 过滤器
    Springboot之OncePerRequestFilter过滤器原文链接:https://www.cnblogs.com/javalinux1/p/16389683.html类说明OncePerRequestFilter能够确保在一次请求只通过一次filte......
  • VUE3企业级项目基础框架搭建流程(2)
    typescript安装这里使用的vue项目语言为:TypeScript,不了解的可以先去学习一下。TypeScript中文网正常情况下安装typescript的命令为://全局安装npminstall-gtypescri......
  • VUE3企业级项目基础框架搭建流程(1)
    开发环境和技术栈操作系统windows11开发工具vscode、phpstudy(小皮):nginx1.15.11,mysql5.7.26,php7.4,NavicatforMySQL前端VUE3、TypeScript、SCSS、ElementUi、R......
  • SpringBoot自定义starter
    SpringBoot自定义starter目录SpringBoot自定义starter1自定义starter1.1新建project和Module1.2对于starter-provider1.3install1.4对于starter-user1.5测试2执行......
  • 230116_50_SpringBoot入门
    指定自定义的配置文件bill.propertiesbill.properitesname=billage=11happy=falsebirth=2021/12/2通过@PropertySource注解指定自定义的配置文件@PropertyS......
  • 写一个 Hello SpringBoot2 项目
     项目目录:helloSpringBoot2、MainApplication、pom.xml  helloSpringBoot2逻辑类,标记@RestController/*@RestController的作用等同于@Controller+@ResponseB......
  • yml文件配置了但是springboot读不到yml的内容的问题(已解决)
    在写项目时可能误操作加了这一句代码,结果就导致了系统读不到yml配置解决方法:删除pom.xml中的<packagin>pom</packagin>或者尝试 https://blog.csdn.net/qq_41555595/art......