Springboot整合策略模式概念->使用场景->优缺点->企业级实战
创始人
2024-03-06 06:11:52
0

一、前言

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

二、策略模式

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{@Overridepublic String execute(String seasons) {return seasons + "来了!我们一起去放风筝吧!";}
}

4. 夏季具体实现

/*** 夏季具体实现* @author wangzhenjun* @date 2022/12/1 9:34*/
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("summer")
public class SummerStrategy implements SeasonsStrategy{@Overridepublic String execute(String seasons) {return seasons + "来了!我们一起去游泳吧!";}
}

5. 秋季具体实现

/*** 秋季具体实现* @author wangzhenjun* @date 2022/12/1 9:34*/
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("autumn")
public class AutumnStrategy implements SeasonsStrategy{@Overridepublic String execute(String seasons) {return seasons + "来了!我们一起去放看枫叶吧!";}
}

6. 冬季具体实现

/*** 冬季具体实现* @author wangzhenjun* @date 2022/12/1 9:34*/
// 指定容器的名称,不指定默认为类名称首字母小写
@Component("winter")
public class WinterStrategy implements SeasonsStrategy{@Overridepublic String execute(String seasons) {return seasons + "来了!我们一起去打雪仗吧!";}
}

7. 上下文工厂实现

private Map 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值则为对应的策略实现类*/@Autowiredprivate Map 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 {@Autowiredprivate 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 分支语句判断;其缺点在于客户端必须知道所有的策略类,增加了系统中类的个数。

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

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


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

点击访问!小编自己的网站,里面也是有很多好的文章哦!

相关内容

热门资讯

从提示函到检察建议,“一函两书... 涉铅电池企业社会保险缺失,无法保障劳动者发生事故伤害或罹患职业病后的医疗救治、经济补偿等权益,检察机...
原创 《... 12月25日,电视剧《唐诡奇谭》已经可以在爱奇艺全集观看。这部剧作总计由两个故事单元组成。一个是“解...
自制手册+共情沟通,东湖高新区... 极目新闻通讯员 柴莹 潘婷 连日来,武汉东湖高新区佛祖岭街道综合执法中心向辖区沿街夜市商铺送上一份由...
8个包裹全是金条!小心兼职“代... 三湘都市报12月25日讯(文/视频 全媒体记者 王智芳 通讯员 刘毅)12月25日,记者从邵阳市公安...
人民监督员制度把民意融入检察工... 2015年2月,习近平总书记主持召开中央全面深化改革领导小组会议,审议通过《深化人民监督员制度改革方...
美法官驳回H-1B签证费涨价起... 新华社华盛顿12月23日电(记者杨伶 熊茂伶)美国一名联邦法官23日驳回美国商会和美国大学协会就特朗...
构建完善无人机管理法规体系 护... “十五五”规划建议稿明确提出“建设现代化产业体系,巩固壮大实体经济根基”,并将低空经济纳入未来五年重...
无人机“黑飞”的危害及法律责任 如今,无人机已不是专业玩家的专属装备,从旅游航拍到物流配送,从农业植保到电力巡检,从应急救援到地理测...
一次性信用修复彰显政策温度 中国人民银行日前发布一次性信用修复政策有关安排,对于2020年1月1日至2025年12月31日期间,...