1. SpringBoot结合策略模式实战套路

1.1. 前言

我们都知道设计模式好,可以让我们的代码更具可读性,扩展性,易于维护,但大部分程序猿一开始都学过至少一遍设计模式吧,实战中不知用到了几成。接下来让我介绍一个结合SpringBoot的策略模式套路,让你的代码少些if-else

1.2. 开撸

废话不多说,直接告诉你今天的核心是@autowired,看到这个是不是很熟悉,你每天都在用,不就是自动注入Spring管理的Bean吗?但我们对它的用法很多时候就局限在全局变量的注入了,忘记了,它其实还可以构造器注入,类型注入或命名注入,那么结合策略模式会绽放怎样的火花呢?跟着我的代码来看

1.2.1. 计算策略接口

/**
* @author laoliangliang
* @date 2019/10/28 10:10
*/
public interface CalculateStrategy {
int doOperation(int num1,int num2);
}

1.2.2. 实现类

分别实现加减乘三个运算,可以看到我用了spring的注解@Component,也就是实例由spring管理了

@Component
public class AddOperation implements CalculateStrategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
} }
@Component
public class SubstractOperation implements CalculateStrategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
} }
@Component
public class MultiplyOperation implements CalculateStrategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
} }

1.2.3. 上下文

之后创建上下文管理,用于提取策略。这个上下文才是本文的重点,注意到@autowired注解放的位置和对应的参数列表了吗?实际上它还可以注入到Map和List,Map的key就是它注入时的名,List则是存放全部实例对象

import com.google.common.base.Preconditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
* @author laoliangliang
* @date 2019/10/28 10:14
*/
@Component
public class CalculatelOperationContext { // @Autowired
// private Map<String, CalculateStrategy> strategyMap; private final Map<String, CalculateStrategy> strategyMap = new ConcurrentHashMap<>(); @Autowired
public void stragegyInteface(Map<String, CalculateStrategy> strategyMap) {
this.strategyMap.clear();
strategyMap.forEach(this.strategyMap::put);
System.out.println(this.strategyMap);
} @Autowired
public void stragegyInteface2(List<CalculateStrategy> strategyMap) {
strategyMap.forEach(System.out::println);
} public CalculateStrategy strategySelect(String mode) {
Preconditions.checkArgument(!StringUtils.isEmpty(mode), "不允许输入空字符串");
return this.strategyMap.get(mode);
}
}

打印结果:

{multiplyOperation=com.laoliang.springboot.pattern.strategy.MultiplyOperation@372ea2bc, addOperation=com.laoliang.springboot.pattern.strategy.AddOperation@4cc76301, substractOperation=com.laoliang.springboot.pattern.strategy.SubstractOperation@2f08c4b}
com.laoliang.springboot.pattern.strategy.AddOperation@4cc76301
com.laoliang.springboot.pattern.strategy.MultiplyOperation@372ea2bc
com.laoliang.springboot.pattern.strategy.SubstractOperation@2f08c4b

可以看到Map中key,value的关系,key的默认值为类的第一个字母小写

1.2.4. 控制层

/**
* @author laoliangliang
* @date 2019/10/28 10:52
*/
@RestController
public class StrategyController { @Autowired
private CalculatelOperationContext calculatelOperationContext; @RequestMapping(value = "/operation")
public String strategySelect(@RequestParam("mode") String mode) {
return String.valueOf(calculatelOperationContext.strategySelect(mode).doOperation(20, 5));
}
}

启动SpringBoot,浏览器调用http://localhost:8080/operation?mode=multiplyOperation,结果100。模式可以选择另外两个addOperationsubstractOperation

我这里就做个演示,输入参数就写固定了,可以看到我们通过上下文calculatelOperationContext调用其方法strategySelect,通过不同的调用参数获得不同的策略,所以业务中只要可以抽象的方法都可以改写成这样的模式。

这种模式套路的好处就是当你要新增一种策略,比如除法,你不需要修改原来的代码,只要抽象不变,你新增一个DivideOperation类实现CalculateStrategy策略接口加上Spring注解即可,调用时模式修改为divideOperation就可以实现调用了,耦合性大大降低,不需要再改原来那一坨自己都看不下去的代码了

1.3. 总结

可以看到全文中代码量还是相对比较少的,将不同的策略用不同的类实现,且可以不用改动别的代码,这篇文章你get到新套路了吗

接下来我争取每篇文章下都分享一套学习视频,希望你们喜欢!!

龙果学院 秒杀系统企业级实战应用(真实工业界案例)视频



欢迎关注公众号,一起学习进步

SpringBoot结合策略模式实战套路的更多相关文章

  1. ## springboot 下策略模式的简单使用

    1.灵魂三问 接手前人(已跑路)项目快乐否? 前人项目不写注释懵逼否? 一个方法中一堆if/else,且业务判断条件用简单数字(或英文字母),不带注释,想打人否?     所以,对于上述三个问题,我写 ...

  2. springboot使用策略模式实现一个基本的促销

    策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换, 此模式让算法的变化独立于使用算法的客户 源码:https://github.com/youxiu326/sb_promotion.git ...

  3. SpringBoot使用策略模式+工厂模式

    为了防止大量的if...else...或switch case代码的出现,可以使用策略模式+工厂模式进行优化. 在我的项目当中,报表繁多,所以尝试了这种方式进行优化报表的架构.代码很简单,如下: Fa ...

  4. 用SpringBoot实现策略模式

    问题的提出 阅读别人代码的时候最讨厌遇到的就是大段大段的if-else分支语句,一般来说读到下面的时候就忘了上面在判断什么了.很多资料上都会讲到使用策略模式来改进这种代码逻辑. 策略模式的类图如下: ...

  5. 【java设计模式】(7)---策略模式(案例解析)

    策略模式 一.概念 1.理解策略模式 策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现.策略模式最大的特点是行为的变化,行为之间可以相互替换. 每个if判断 ...

  6. [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)

    [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...

  7. [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)

    [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...

  8. Springboot中实现策略模式+工厂模式

    策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式? 具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELS ...

  9. SpringBoot自定义初始化Bean+HashMap优化策略模式实践

    策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 传统的策略模式一般是创建公共接口.定义公共方法-->然后创建实体类实现公共接口.根据各自的 ...

随机推荐

  1. /cygdrive/c/MinGW/bin/autoconf-2.68: line 501: /mingw/bin/autom4te-2.68: No such file or directory

    出现如下错误 编译openssh的时候 # autoconf /cygdrive/c/MinGW/bin/autoconf-2.68: line 501: /mingw/bin/autom4te-2. ...

  2. iOS UIPopoverView的使用

    UIViewController *contentViewController = [[UIViewController alloc] init]; contentViewController.vie ...

  3. Shell命令-用户用户组管理之id、su

    文件及内容处理 - id.su 1. id:查看用户的uid,gid及归属的用户组 id命令的功能说明 id 命令用于显示用户的 ID,以及所属群组的 ID.id 会显示用户以及所属群组的实际与有效I ...

  4. 爬虫---lxml爬取博客文章

    上一篇大概写了下lxml的用法,今天我们通过案例来实践,爬取我的博客博客并保存在本地 爬取博客园博客 爬取思路: 1.首先找到需要爬取的博客园地址 2.解析博客园地址 # coding:utf-8 i ...

  5. 无法添加符号: 归档没有索引;运行 ranlib 以添加一个

    这将告诉您对象文件的格式.如果对象文件是针对不同的平台编译的,则会导致无法为存档创建索引.要纠正这种情况,您需要重新编译这些文件.

  6. 3、zabbix组件之间的关系

    我们在安装zabbix的时候安装了四个软件:zabbix-server.zabbix-server-mysql.zabbix-web-mysql.zabbix-agent,那么这个四个软件之间有什么关 ...

  7. IntelliJ IDEA 创建动态的JavaWeb工程(五)

    1. 创建动态的web项目 如果创建项目后没有自动创建web文件夹,即没有自动创建 web.xml 及 index.jsp 文件,还可以通过IDEA编辑器中的File -- Project Struc ...

  8. React、Vue、Angular对比 ---- 介绍及优缺点

    React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站, 并于 2013年 5 月开源.React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它.它 ...

  9. Python网络编程基础 ❷ 基于upd的socket服务 TCP黏包现象

    TCP的长连接 基于upd的socket服务 TCP黏包现象

  10. yii2-CaptchaAction macos500 不显示

    把公司一个项目pull到本地 发现验证码不输出了 怀疑是gd库没装  php -m看了下 gd库是装了的 有搜索到可能是因为自带的php拓展生成不了png(觉得不太可能) 试了下自己写一个图片生成pn ...