• 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

  • 相关阅读:
    Pr:编辑字幕
    [Display嵌入式]SDL播放 mjpeg 檔案到屏幕上
    interface 接口相关【GO 基础】
    Allocating and Freeing Device Numbers
    ImageMagick命令注入漏洞(CVE-2016–3714)
    数据结构-AVL树(平衡二叉树)
    PerfView专题 (第十一篇):使用 Diff 功能洞察 C# 内存泄漏增量
    “GoodsPriceOverOff“ app Tech Support(URL)
    Tensorflow 2.1 MNIST 图像分类
    3D印刷电路板在线渲染查看工具
  • 原文地址:https://blog.csdn.net/XikYu/article/details/130877675