温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot的策略模式的应用场景实例代码分析

发布时间:2022-02-24 10:07:10 来源:亿速云 阅读:170 作者:iii 栏目:开发技术

这篇“SpringBoot的策略模式的应用场景实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot的策略模式的应用场景实例代码分析”文章吧。

前言

在实际业务代码中,我们经常会碰到这样的代码:

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 的依赖注入和自动发现。

@Service
public 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 A
A

同理,不同传参都会进入不同的策略执行方法。过这个简单的 demo,就可以看到通过获取输入不同的资源池 id,可以自动的拿到不同的资源。
通过实践总结下来,使用策略模式的好处就是通过一个封装的上下文可以自由的切换不同的算法,省去多重判断,同时可以具有很好的扩展性。

总结

从上面可以看出,策略模式的优缺点十分明显,在我们实际的业务中,也需要看情况使用。

优点:

  • 策略模式符合开闭原则

  • 代码简洁,从上下文自动获取条件转移语句

  • 使用策略模式可以提高算法的保密性和安全性

缺点:

  • 每个策略都需要单独实现一个类,当策略很多时,会产生大量的策略类,会使代码出现“膨胀”

  • 客户端必须知道所有的策略

  • 策略模式的一系列算法地位是平等的,是可以相互替换的,事实上构成了一个扁平的算法结构,也就是在一个策略接口下,有多个平等的策略算法,就相当于兄弟算法。而且在运行时刻只有一个算法被使用,这就限制了算法使用的层级,使用的时候不能被嵌套使用

以上就是关于“SpringBoot的策略模式的应用场景实例代码分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI