• Java中如何使用策略模式减少 if / else 分支的使用


    目录

    1、策略模式

    1.1 、策略模式包含三个角色:

    2、需求

    2.1 、传统方式

    2.2 、策略模式实现

    2.2.1 、新建PolicyPatternController.java

    2.2.2 、Express.java(实体类)

    2.2.3 、定义一个接口:PolicyPatternService.java

    2.2.4 、定义3个实现类来实现 PolicyPatternService 接口


    1、策略模式

            策略模式是一种设计模式,它允许在运行时动态选择算法的行为。它定义了一系列算法,并将每个算法都封装到了一个独立的类中,这些算法可以相互替换使用。在策略模式中,一个类的行为或算法可以在运行时进行更改,而不必修改它的结构。

    1.1 、策略模式包含三个角色:

    1. Context(上下文):持有一个策略对象的引用,并调用策略对象提供的算法。

    2. Strategy(策略):定义所有支持的算法的公共接口,并提供具体的实现。

    3. ConcreteStrategy(具体策略):实现 Strategy 接口,提供具体的算法实现。

          策略模式可以帮助我们避免出现大量的 if-else 语句或 switch 语句,使得代码更加简洁、易于维护和扩展。它广泛应用于需要动态地切换算法的场景,例如排序、搜索等算法。

    2、需求

         根据传入不同的类型,从而进行不同的处理

    2.1 、传统方式

    1. @Service
    2. public class TesiImpl implements PolicyPatternService {
    3. @Override
    4. public String sayHello(String type) {
    5. if ("1".equals(type)) {
    6. // TODO 具体业务代码
    7. }
    8. if ("2".equals(type)) {
    9. // TODO 具体业务代码
    10. }
    11. if ("3".equals(type)) {
    12. // TODO 具体业务代码
    13. }
    14. if ("4".equals(type)) {
    15. // TODO 具体业务代码
    16. }
    17. .................................
    18. return null;
    19. }
    20. }

    这种写法可读性差,后期不易于维护项目。。。。。。

    2.2 、策略模式实现

    2.2.1 、新建PolicyPatternController.java

    1. @RestController
    2. @RequestMapping("celue")
    3. @Slf4j
    4. public class PolicyPatternController {
    5. @Autowired
    6. private List policyPatternService;
    7. @PostMapping("test")
    8. public Result test(@RequestBody Express expres) {
    9. PolicyPatternService service = policyPatternService.
    10. stream().
    11. filter(l -> l.isCeLueModel(expres.getType())).findFirst().orElse(null);
    12. String name = service.sayHello();
    13. return Result.ok(name);
    14. }
    15. }

    2.2.2 、Express.java(实体类)

    1. @Data
    2. public class Express {
    3. @ApiModelProperty("根据不同的类型实现不同的方法")
    4. private String type;
    5. }

    2.2.3 、定义一个接口:PolicyPatternService.java

    1. public interface PolicyPatternService {
    2. //判断传入的类型
    3. Boolean isCeLueModel(String type);
    4. // 方法
    5. String sayHello();
    6. }

    2.2.4 、定义3个实现类来实现 PolicyPatternService 接口

    1. JDServcieImpl.java

    1. @Service
    2. public class JDServcieImpl implements PolicyPatternService {
    3. //判断传入的类型
    4. @Override
    5. public Boolean isCeLueModel(String type) {
    6. return Objects.equals(type, "1");
    7. }
    8. @Override
    9. public String sayHello() {
    10. // TODO 具体业务代码
    11. return "我是京东";
    12. }
    13. }

    2. YZServcieImpl.java

    1. @Service
    2. public class YZServcieImpl implements PolicyPatternService {
    3. //传入的类型
    4. @Override
    5. public Boolean isCeLueModel(String type) {
    6. return Objects.equals(type, "2");
    7. }
    8. @Override
    9. public String sayHello() {
    10. // TODO 具体业务代码
    11. return "我是邮政";
    12. }
    13. }

    3. ZTServcieImpl.java

    1. @Service
    2. public class ZTServcieImpl implements PolicyPatternService {
    3. //判断传入的类型
    4. @Override
    5. public Boolean isCeLueModel(String type) {
    6. return Objects.equals(type, "3");
    7. }
    8. @Override
    9. public String sayHello() {
    10. // TODO 具体业务代码
    11. return "我是中通";
    12. }
    13. }

    4. 测试效果 type = 1

    5. 测试效果 type = 2

    6. 测试效果 type = 3

  • 相关阅读:
    DM_SQL
    基于R语言、MATLAB、Python机器学习方法与案例分析
    wordpress最新Justnews主题源码6.0.1开心版+社交问答插件2.3.1+附教程
    mysql 事务 Read Committed
    vue3.0的setup函数以及解决其内的数据不是响应式数据的问题
    CompletableFuture异步编程Api使用详解
    做短视频内容需要注意的五大要素,你做的内容都有吗
    pwnable-1-fd
    Redis 持久化之AOF操作
    视频评价工具AVQT介绍
  • 原文地址:https://blog.csdn.net/XikYu/article/details/130877675