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

实战讲解,原来用 SpringBoot 实现策略模式可以这么简单

时间:2023-03-18 00:35:56 科技观察

实践讲解,原来用SpringBoot实现策略模式原来可以这么简单阅读的时候层次感更强,同时扩展性也会提高!最近在看同事的代码的时候,学到了一个小技巧。在某些场景下合理使用策略模式还是很有用的。我想在这里与大家分享。2.代码实践在介绍如何在SpringBoot中实现策略设计模式之前,我们先简单回顾一下策略模式的设计思路。写一个简单的程序计算器,代码如下!首先,我们定义一个Operation接口,用于逻辑计算;publicinterfaceOperation{/***Executecalculation*@parama*@paramb*@return*/intexecute(inta,intb);}然后,将四个if判断逻辑分离到一个模块中单独处理;公共类AddOperation实现操作{@Overridepublicintexecute(inta,intb){returna+b;}}publicclassSubOperationimplementsOperation{@Overridepublicintexecute(inta,intb){returna-b;}}publicclassMultiOperationimplementsOperation{@Overridepublicintexecute(inta,intb){returna*b;}}publicclassDivOperationimplementsOperation{@Overridepublicintexecute(inta,intb){returna/b;}}然后,创建一个工厂类,用于处理客户端传入的参数;publicclassOperatorFactory{privatestaticMapoperationMap=newHashMap<>();static{//初始化实现类operationMap.put("add",newAddOperation());operationMap.put("子",新的子操作());operationMap.put("multi",newMultiOperation());operationMap.put("div",newDivOperation());//更多操作符}/***获取对应的目标实现类*@paramoperator*@return*/publicstaticOptionalgetOperation(Stringoperator){returnOptional.ofNullable(operationMap.get(operator));}}最后,只在需要的地方介绍方法!publicclassOperatorTestMain{publicstaticvoidmain(String[]args){//获取计算出的目标实现类OperationtargetOperation=OperatorFactory.getOperation("add").orElseThrow(()->newIllegalArgumentException("InvalidOperator"));intresult=targetOperation.execute(1,2);System.out.println("结果:"+结果);}}以上是策略模式的典型实践,从代码的可读性和可扩展性来看,还是很干净整洁的那么,在SpringBoot项目中我们应该如何使用呢?3、SpringBoot实际应用3.1、方案一首先,我们仍然定义一个Command接口,用于方法的抽象和统一;publicinterfaceCommand{/***命令类型*@return*/StringoperateType();/***Execute*@parama*@paramb*@return*/Integerexecute(inta,intb);}然后,编写四组不同的计算处理逻辑;@ComponentpublicclassAddCommandimplementsCommand{@OverridepublicStringoperateType(){return"add";}@OverridepublicIntegerexecute(inta,intb){returna+b;}}@ComponentpublicclassSubCommandimplementsCommand{@OverridepublicStringoperateType(){return"subtract";}@OverridepublicIntegerexecute(inta,intb){returna-b;}}@ComponentpublicclassMultiCommandimplementsCommand{@OverridepublicStringoperateType(){return"multiply";}@OverridepublicIntegerexecute(inta,intb){returna*b;}}@Componentpublic类DivCommandimplements命令{@OverridepublicStringoperateType(){return"divide";}@OverridepublicIntegerexecute(inta,intb){returna/b;}}然后,写一个类似于上文的策略处理类;@ComponentpublicclassCalculatorServiceimplementsApplicationContextAware{privateMapcommandMap=newConcurrentHashMap<>();/***执行计算*@paramoperateType*@parama*@paramb*@return*/publicintcalculate(StringoperateType,inta,intb){CommandtargetCommand=Optional.ofNullable(commandMap.get(operateType)).orElseThrow(()->newIllegalArgumentException("无效运算符"));返回targetCommand.execute(a,b);}@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{MaptempMap=applicationContext.getBeansOfType(Command.class);tempMap.values().forEach(源->commandMap.put(source.operateType(),源));}}最后,我们只需要到位申请!@RunWith(SpringRunner.class)@SpringBootTestpublicclassCalculatorServiceTest{@AutowiredprivateCalculatorServicecalculatorService;@Testpublicvoidtest(){intresult=calculatorService.calculate("add",1,2);System.out.println("结果:"+结果);}}总结:该方案的做法和上面介绍的思路基本一致,区别在于springboot启动时,会把对象注入到IOC容器中3.2,方案2(推荐)查看Spring的ioc容器,而你会发现一个秘密。当一个接口有多个实现类时,Spring会自动将Strategy接口的实现类注入到这个Map中。key是beanid,value是对应的策略实现。种类。简单来说,我们只需要通过@Autowired注入对象即可,不需要通过CalculatorService类单独配置。操作方法如下!首先编写一个CommandFactory工厂类进行逻辑处理;@ComponentpublicclassCommandFactory{/***Spring会自动将Strategy接口的实现类注入到这个Map中,key是beanid,value是对应的strategy实现类*/@AutowiredprivateMap命令映射;/***执行计算*@paramoperateType*@parama*@paramb*@return*/publicintcalculate(StringoperateType,inta,intb){CommandtargetCommand=Optional.ofNullable(commandMap.get(operateType)).orElseThrow(()->newIllegalArgumentException("无效运算符"));返回targetCommand.execute(a,b);}}最后,直接在合适的地方到处使用CommandFactory!@RunWith(SpringRunner.class)@SpringBootTestpublicclassCalculatorServiceTest{@AutowiredprivateCommandFactorycommandFactory;@Testpublicvoidtest(){intresult=commandFactory.calculate("addCommand",1,2);System.out.println("结果:"+结果吨);}}总结:方案二和方案一的区别在于不需要显式写CalculatorService策略处理类来初始化对象。Spring在初始化对象的时候,可以帮我们实现对象注入!4.小结本文主要介绍了在SpringBoot中引入策略模式的设计思路和实践方法。在实际业务开发中,合理使用策略模式可以让代码看起来更简洁,业务扩展性更强大。希望对大家有所帮助!