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

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

1、策略模式

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

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

  1. Context(上下文):持有一个策略对象的引用,并调用策略对象提供的算法。
  2. Strategy(策略):定义所有支持的算法的公共接口,并提供具体的实现。
  3. ConcreteStrategy(具体策略):实现 Strategy 接口,提供具体的算法实现。

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

2、需求

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

2.1 、传统方式

@Service
public class TesiImpl implements PolicyPatternService {
   @Override
   public String sayHello(String type) {
      if ("1".equals(type)) {
         // TODO 具体业务代码
      }
      if ("2".equals(type)) {
         // TODO 具体业务代码
      }
      if ("3".equals(type)) {
         // TODO 具体业务代码
      }
      if ("4".equals(type)) {
         // TODO 具体业务代码
      }
      .................................
      return null;
   }
}

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

2.2 、策略模式实现

2.2.1 、新建PolicyPatternController.java

@RestController
@RequestMapping("celue")
@Slf4j
public class PolicyPatternController {
    @Autowired
    private List<PolicyPatternService> policyPatternService;
    @PostMapping("test")
    public Result test(@RequestBody Express expres) {
        PolicyPatternService service = policyPatternService.
                stream().
                filter(l -> l.isCeLueModel(expres.getType())).findFirst().orElse(null);
        String name = service.sayHello();
        return Result.ok(name);
    }
}

2.2.2 、Express.java(实体类)

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

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

public interface PolicyPatternService {
    //判断传入的类型
    Boolean isCeLueModel(String type);
    // 方法
    String sayHello();
}

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

1. JDServcieImpl.java

@Service
public class JDServcieImpl implements PolicyPatternService {
    //判断传入的类型
    @Override
    public Boolean isCeLueModel(String type) {
        return Objects.equals(type, "1");
    }
    @Override
    public String sayHello() {
        // TODO 具体业务代码
        return "我是京东";
    }
}

2. YZServcieImpl.java

@Service
public class YZServcieImpl implements PolicyPatternService {
   //传入的类型
   @Override
   public Boolean isCeLueModel(String type) {
      return Objects.equals(type, "2");
   }
   @Override
   public String sayHello() {
      // TODO 具体业务代码
      return "我是邮政";
   }
}

3. ZTServcieImpl.java

@Service
public class ZTServcieImpl implements PolicyPatternService {
   //判断传入的类型
   @Override
   public Boolean isCeLueModel(String type) {
      return Objects.equals(type, "3");
   }
   @Override
   public String sayHello() {
      // TODO 具体业务代码
      return "我是中通";
   }
}

4. 测试效果 type = 1

2c2af9ad71894ce7a3a7745c23f16114.png

5. 测试效果 type = 2

4f6deb1fa1884c58b2134432832a5073.png

6. 测试效果 type = 3

7c0df9a811cd44159c5836ae304c24ee.png


目录
相关文章
|
7月前
|
设计模式 缓存 算法
JAVA设计模式14:策略模式,使算法的变化独立于使用它的客户端
JAVA设计模式14:策略模式,使算法的变化独立于使用它的客户端
|
6天前
|
Java
Java(十)单分支与多分支语句
Java(十)单分支与多分支语句
76 0
|
4天前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
9 1
|
6天前
|
小程序 Java 容器
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
10 0
|
6天前
|
Java 测试技术
Java一分钟之-控制流程:if条件语句与switch
【5月更文挑战第8天】本文探讨了Java编程中的`if`和`switch`控制流程语句,强调了常见问题和易错点。对于`if`语句,需注意使用大括号避免逻辑错误,完整比较操作,以及理解`&&`和`||`的短路行为。在`switch`语句中,要注意只能基于常量进行判断,每个`case`后应有`break`,并提供`default`分支。避免错误的策略包括始终使用大括号、确保清晰的条件、进行代码审查和编写单元测试。掌握这些要点对编写高效、可维护的代码至关重要。
19 0
Java一分钟之-控制流程:if条件语句与switch
|
6天前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
23 1
|
6天前
|
Java 测试技术
滚雪球学Java(12):JavaSE-if条件语句入门指南:掌握代码分支流程!
【4月更文挑战第1天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
52 1
滚雪球学Java(12):JavaSE-if条件语句入门指南:掌握代码分支流程!
|
6天前
|
Java 测试技术 数据安全/隐私保护
滚雪球学Java(12-0):JavaSE-if条件教学
【4月更文挑战第15天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
25 0
滚雪球学Java(12-0):JavaSE-if条件教学
|
6天前
|
设计模式 算法 搜索推荐
23种设计模式,策略模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】设计模式是软件工程中的一种最佳实践指导,用于解决常见的设计问题。它们被分类为创建型、结构型和行为型模式。其中,策略模式是一种行为型设计模式,旨在定义一系列算法,封装每一个算法,并使它们可互换。策略模式允许算法独立于使用它们的客户端变化
28 2
|
6天前
|
数据格式
Java_分支语句、循环语句
该文段介绍了编程中的分支语句和循环语句。`switch`语句用于根据不同的值执行相应的代码块,支持byte, short, char, int, 枚举和String类型。每个`case`后的值必须唯一,且可利用`default`处理未匹配的情况。`if`语句用于单个或多个条件判断,有单分支、双分支(含`else`)和多分支形式。`for`、`while`和`do...while`循环分别适用于已知和未知循环次数的场景,`do...while`的特点是至少执行一次。此外,还提到了死循环的概念和循环嵌套,以及`break`和`continue`这两个跳转控制语句的作用。
18 1