当前位置: 首页 > 科技观察

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

时间:2023-03-12 16:38:48 科技观察

1.前言策略模式可能是工作中使用最多的,也是面试中提到频率最高的,代码重构优化必须有!小编之前一直说,其实没有真正的实战;最近有机会做实战,就分享一下自己的经验,在企业层面使用!二、策略模式1、什么是策略模式strategypattern,英文全称是StrategyDesignPattern。在GoF的《设计模式》一书中,是这样定义的:定义一族算法类,将各个算法分别封装起来,使其可以相互替代。Strategy模式可以独立于使用它们的客户端(这里的客户端是指使用算法的代码)对算法进行更改。2.策略模式结构由Strategy:抽象策略类,一般为接口或策略类ConcreteStrategy:具体算法实现策略类Context:环境或上下文类,用于统一执行具体策略其实以上三部分在解释中大白话:需要一个接口和策略,对接口和方法进行标准化和约束。这时候就需要一些具体的实现算法类来继承或者实现刚才的接口和策略。最后,通过一个environment或者context,也可以叫做工厂,根据类型来调用具体的算法!3、使用场景避免冗长的if-else或switch分支判断。需要动态地选择几种算法中的一种来向客户端隐藏特定策略(算法)的实现细节。它们之间是完全独立的,其余不受影响的具体场景一般都会扩展。:选择支付方式折扣,选择全额折扣方式根据类型调用不同的系统4.优缺点优点:可扩展性好,符合开闭原则,符合单一职责原则,可读性好,容易维护,避免多层判断缺点:策略太多,导致策略类对新手阅读代码不友好三、策略模式实战1、实例实例今天,小编需要根据四个做不同的事情春夏秋冬四季展示攻略模式使用方案;要求是:如果是春天,一定要放行;如果是夏天,就得去游泳。如果是秋天,一定要去看枫叶。如果是冬天,你必须去打雪仗。如果不用策略模式,那一定是if-ifelse来实现!下面就带大家体验一下具体的使用吧!!2.策略接口/***四季策略*@authorwangzhenjun*@date2022/12/19:30*/publicinterfaceSeasonsStrategy{/***根据季节执行不同的计划*@paramseasons*@return*/Stringexecute(Stringseasons);}3.Spring具体实现/***Spring具体实现*@authorwangzhenjun*@date2022/12/19:34*///指定容器名称,如果没有指定,默认是一个class名称首字母小写@Component("spring")publicclassSpringStrategyimplementsSeasonsStrategy{@OverridepublicStringexecute(Stringseasons){returnseasons+"我们来了!一起去放风筝吧!";}}4。暑期具体实现/***暑期具体实现*@authorwangzhenjun*@date2022/12/19:34*///指定容器名称,不指定默认为类名首字母小写@Component("summer")publicclassSummerStrategyimplementsSeasonsStrategy{@OverridepublicStringexecute(Stringseasons){returnseasons+"我们来了!一起去游泳吧!";}}5。Autumn具体实现/***Autumn具体实现*@authorwangzhenjun*@date2022/12/19:34*///指定容器名称,不指定默认为类的小写首字母name@Component("autumn")publicclassAutumnStrategyimplementsSeasonsStrategy{@OverridepublicStringexecute(Stringseasons){returnseasons+"我们来了!一起去看枫叶吧!";}}6.Winter具体实现/***Winter具体实现*@authorwangzhenjun*@date2022/12/19:34*///指定容器名称,不指定默认为首字母小写的类名@Component("winter")publicclassWinterStrategyimplementsSeasonsStrategy{@OverridepublicStringexecute(Stringseasons){returnseasons+"我们来了!让我们去打雪仗吧!";}}7.上下文工厂实现privateMapseasonsMap;这个是最重要的,很多时候我们都知道怎么写策略和实现,但是不知道怎么放进去,怎么调用一个统一的方式。把自己放在地图上当然spring已经帮我们组装好了,按需调用即可!核心:Spring会自动将Strategy接口的实现类注入到这个Map中,key是beanid,value是对应的strategy实现类!/***环境或上下文类,用于统一执行具体的策略*@authorwangzhenjun*@date2022/12/19:56*/@ComponentpublicclassSeasonsFactory{/***Spring会自动实现Strategy接口的class注入到这个Map中,key是beanid,value是对应的策略实现类*/@AutowiredprivateMapseasonsMap;/***处理四个季节统一入口方法*@paramseasons*@parambeanName*@return*/publicStringhandle(Stringseasons,StringbeanName){//根据bean名seasonsStrategy获取对应的算法处理类SeasonsStrategy=seasonsMap.get(beanName);Stringexecute=seasonsStrategy.execute(seasons);返回执行;}}8.控制器处理@Slf4j@RestController@RequestMapping("/test")publicclassTestController{@AutowiredprivateSeasonsFactoryseasonsFactory;@GetMapping("/strategyTest/{seasons}/{beanName}")publicResultstrategyTest(@PathVariable("seasons")Stringseasons,@PathVariable("beanName")StringbeanName){Stringhandle=seasonsFactory.handle(seasons,beanName);返回结果.成功(句柄);}}9.测试http://localhost:8087/test/strategyTest/spring/springhttp://localhost:8087/test/strategyTest/summer/summer4.总结一系列算法定义在策略模式,每个算法都是封装的,可以相互替换,不影响彼此的策略模式得益于按照开闭原则设计,每个具体算法按照单一职责原则设计;提高了代码的复用性,对客户端隐藏了具体策略(算法)的实现细节,完全相互独立,不影响其余的扩展;避免if-else或switch分支语句判断;它的缺点是客户端必须知道所有的策略类,这增加了系统中类的数量。在日常开发中,一般用于消除多重判断。有时候,不要为了使用设计模式而使用设计模式。一定要结合业务场景。过度设计也是致命的!