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


目录
相关文章
|
4月前
|
Java
java线程之分支合并框架
java线程之分支合并框架
|
5月前
|
Java
Java条件分支语句
Java条件分支语句
45 3
|
5月前
|
设计模式 算法 Java
Java中的策略模式
Java中的策略模式
40 1
|
7天前
|
设计模式 运维 算法
Java设计模式-策略模式(15)
Java设计模式-策略模式(15)
|
5月前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
81 1
|
2月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
40 2
|
2月前
|
设计模式 算法 Java
【十六】设计模式~~~行为型模式~~~策略模式(Java)
文章详细介绍了策略模式(Strategy Pattern),这是一种对象行为型模式,用于定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法独立于使用它的客户而变化,提高了系统的灵活性和可扩展性。通过电影院售票系统中不同类型用户的打折策略案例,展示了策略模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和测试结果。
【十六】设计模式~~~行为型模式~~~策略模式(Java)
|
2月前
|
Java 数据安全/隐私保护
03 Java流程控制-分支(if+switch+变量类型)
03 Java流程控制-分支(if+switch+变量类型)
24 5
|
4月前
|
设计模式 算法 Java
java策略模式简单分析
java策略模式简单分析
22 0
|
5月前
|
Java
Java中的if选择语句详解
Java中的if选择语句详解
46 1
下一篇
无影云桌面