所有分类
  • 所有分类
  • 未分类

策略模式Java实战-写法3:注入抽象类

说明

本文介绍Java中策略模式的一种写法:注入抽象类。本方法是SpringBoot项目中写策略模式最好的写法

注入抽象类的具体方法是:抽象类+不同的实现类(作为Bean注册到Spring),通过注入抽象类来获取所有的实现类,然后自动找到枚举类对应的那个实现类然后去执行。

此写法的优缺点

优点

  1. 实现类是通过Spring注入的,新增实现类时无需手动添加到策略集合。
  2. 类型是通过枚举指定的,便于维护。
  3. 实现类显式地持有类型,可以方便的获取本类型的信息(比如:描述)。

缺点

实战

项目需求

有不同的支付方式:支付宝、微信、银行卡,前端传了一个payType,根据payType去判断调用哪种支付方式。

思路

  1. 提供一个支付功能抽象类,不同的支付方式去继承这个抽象类。
  2. 抽象类持有具体的类型,在实现类实例化时给它赋值。
  3. 通过注入这个抽象类来获取实现类的集合,通过支付的类型来获取具体实现类,去调用支付的方法。

代码结构

代码

此内容仅限VIP查看,请先

测试

代码

package com.knife.designPattern.controller;

import com.knife.designPattern.constant.PayType;
import com.knife.designPattern.strategy.PayStrategyHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class PayController {
    @Autowired
    private PayStrategyHolder payStrategyHolder;

    @GetMapping("/pay")
    public String pay(PayType payType) {
        payStrategyHolder.pay(payType);
        return "test success";
    }
}

测试

访问:http://localhost:8080/pay?payType=WECHAT_PAY

后端结果

调用远程接口:微信支付

0

评论12

请先

  1. 枚举绑定处理方法的方式不是更简洁方便
    一口粥粥已购买 2024-08-22 0
    • 是的。灵活性、扩展性,都很强
      自学精灵 2024-08-22 0
  2. /** * 支付策略持有类 */ @Component public class PayStrategyHolder { @Autowired private List payList; public void pay(PayType payType) { for (Pay pay : payList) { if (pay.getPayType().equals(payType)) { pay.invokeRemoteInterface(); } } } } 这块假如调用具体子类的方法,需要返回值时,咋处理呢?
    李镇宇zixue 2024-06-14 0
    • 抽象类里写上返回值。具体的子类里将返回值组装为抽象类需要的返回值。
      自学精灵 2024-06-14 0
      • 那这个PayStrategyHolder类里面的for循环里面,调用具体子类方法时,需要有个return?这样感觉有些奇怪
        李镇宇zixue 2024-06-14 0
        • 你要觉得奇怪,可以for循环只找出匹配的策略,找出后,在for循环结束后再执行。结果是一样的。
          自学精灵 2024-06-14 1
          • 好的,明白了,意思是先找到匹配的策略,然后break退出循环,再调用具体的方法
            李镇宇zixue 2024-06-17 0
          • 是的
            自学精灵 2024-06-17 0
  3. 写的好多,还没有之前那种if简单方便
    ゞ╃尐沐則颩...o 2024-06-04 0
    • 策略模式是消除长if用的,短if可以不用策略模式。长if的维护性和扩展性很差,等你写过复杂逻辑就知道啦
      自学精灵 2024-06-05 0
  4. 为什么用抽象类,接口可以吗
    史蒂夫v 2024-04-28 0
    • 用抽象类可以让实现类必须调用抽象类的构造方法(用于判断类型)。接口也可以,使用普通方法去获取类型。
      自学精灵 2024-04-28 1
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录