时间:2021-05-20
在实际业务代码中,我们经常会碰到这样的代码:
String type = actualService.getRealtype(uid);if(type.equals("typeA")){ // do func A}else if(type.equals("typeB")){ // do func B}else if(type.equals("typeC")){ // do func C}else[ //...}这种 if-else 或者 switch-case 代码在每个分支都会判断分支类型,然后执行不同的方法获取结果,当代码分支比较少并且确定不会增加时,使用这种方式也是完全 ok 的,但是当分支比较多,并且后面可能会增加分支判断条件时,这种方式就违反了单一职责和开闭原则,因此对于我们开发工作中遇到这种情况,首先想到的是应该去优化这种代码中的“坏味道”,其中的方法之一就是考虑能不能用策略模式去重写,将代码和业务逻辑解耦,这样才有利于后续的维护工作。
策略模式,简单来说就是通过实现接口来重写不同的方法,从而通过上下文自动获取选择的策略方法并执行。
以下基于 SpringBoot 的依赖注入实现策略模式。假设场景如下:某个客户需要订购多个资源,每个资源在不同资源池中,不同资源池下的资源也都不一样,在此处把原始的 if-else 代码逻辑优化为策略模式。
首先我们实现一个 ResourceStrategy 接口,并定义选择资源的抽象方法:
public interface ResourceStrategy { String orderInformation(String id);}然后根据 if-else 中的判断条件,构造三个资源类实现 ResourceStrategy 接口:
@Component("A")public class ResourceA implements ResourceStrategy { @override public String orderInformation(String id){ System.out.println("策略选择:Strategy A"); return "A"; }}@Component("B")public class ResourceB implements ResourceStrategy { @override public String orderInformation(String id){ System.out.println("策略选择:Strategy B"); return "B"; }}@Component("C")public class ResourceC implements ResourceStrategy { @override public String orderInformation(String id){ System.out.println("策略选择:Strategy C"); return "C"; }}注意其中每个类都需要标注策略类别名称。
然后我们需要写一个 SimpleContext 类来存储我们的策略类别,这时候就用到了 Spring 的依赖注入和自动发现。
@Servicepublic class SimpleContextService { @Autowired private final Map<String, Strategy> strategyMap = new ConcurrentHashMap<>(); public SimpleContext(Map<String, ResourceStrategy > strategyMap) { this.strategyMap.clear(); strategyMap.forEach(strategyMap::put); } public String getResource(String poolId){ return strategyMap.get(poolId).orderInformation(poolId); }}接下来就是我们的实际调用场景了~,如下:
@RestController@RequestMapping("/test")public class TestController { @Autowired private SimpleContextService contextService; @GetMapping("/choose") public String choose(@RequestParam String poolId){ return simpleContext.getResource(poolId); } }那么当我们的入参 poolId 传入 “A” 时,返回的结果如下:
策略选择:Strategy AA同理,不同传参都会进入不同的策略执行方法。过这个简单的 demo,就可以看到通过获取输入不同的资源池 id,可以自动的拿到不同的资源。
通过实践总结下来,使用策略模式的好处就是通过一个封装的上下文可以自由的切换不同的算法,省去多重判断,同时可以具有很好的扩展性。
从上面可以看出,策略模式的优缺点十分明显,在我们实际的业务中,也需要看情况使用。
以上就是SpringBoot策略模式的实践使用的详细内容,更多关于SpringBoot策略模式的使用的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
策略模式是一种行为模式。用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略。策略模式也被称作政策模式。实现过程为
1.理解javascript中的策略模式策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。使用策略模式的优点如下:优点:1.策略
这次介绍一下策略模式(StrategyPattern),相比之下是一种比较简单的模式。它也叫政策模式(PolicyPattern)。策略模式使用的就是面向对象的
一、意图定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化策略模式变化的是算法二、策略模式结构图三、策略
策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。策略模式和T