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

SpringBoot整合策略模式的概念

时间:2023-03-16 01:19:18 科技观察

一、前言策略模式可能是工作中使用最多的,也是面试中提到最多的。代码重构优化必备!小编之前一直说,其实没有真正的实战;最近有机会做实战,就分享一下自己的经验,在企业层面使用!二、策略模式1、什么是策略模式strategypattern,英文全称是StrategyDesignPattern。在GoF的《设计模式》一书中,是这样定义的:定义一族算法类,将各个算法分别封装起来,使其可以相互替代。Strategy模式可以独立于使用它们的客户端(这里的客户端是指使用算法的代码)对算法进行更改。2、策略模式的结构组成Strategy:一个抽象的策略类,一般是一个接口或者一个策略类。ConcreteStrategy:具体算法实现策略类。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*///指定容器名称,如果没有指定,默认是一个类名称首字母小写@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*///指定容器名称,不指定则类名首字母小写@Component("autumn")publicclassAutumnStrategyimplementsSeasonsStrategy{@OverridepublicStringexecute(Stringseasons){returnseasons+"我们来了!我们去看枫叶吧!";}}6。冬季具体实现/***冬季具体实现*@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接口注入到这个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/summer。四。总结策略模式中定义了一系列算法,每个算法都进行了封装,可以相互替换,互不影响。策略模式得益于按照开闭原则设计,各个具体算法按照单一职责原则设计;提高了代码的复用性,对客户隐藏了具体策略(算法)的实现细节,相互之间完全独立,其余的扩展不受影响;避免if-else或switch分支语句判断;它的缺点是客户端必须知道所有的策略类,这增加了系统中类的数量。在日常开发中,一般用于消除多重判断。有时候,不要为了使用设计模式而使用设计模式。一定要结合业务场景。过度设计也是致命的!!