Spring自动注入实现策略模式+工厂模式,干掉 if else

写在开始:一个搬砖程序员的随缘记录

一、前言

在日常的需求中,难免会遇到各种奇奇怪怪的需求,需要各种if else进行实现,但是如果我们使用if else进行实现,一是代码量比较多,二是可维护性比较不强,特别是改别人的代码

业务场景:

通过支付宝、微信、银行卡三种方式进行支付,后期可能会增加其他的支付方式

只是以这个为例子,不一定支付场景就需要使用模式来进行实现

二、if else方式实现

Integer paymentType = 1;

if (paymentType == 1) {
    System.out.println("支付宝支付");
} else if (paymentType == 2) {
    System.out.println("微信支付");
} else if (paymentType == 3) {
    System.out.println("银行卡支付");
}

看起来例子是比较简单,但是可能会有更复杂的场景,只是以这个为例子进行举例,能够通俗易懂

三、策略模式

1、策略接口

定义一个策略接口
UserPaymentService

@Component
public interface UserPaymentService {
    /**
     * 各种支付方式支付
     *
     * @return java.lang.String
     * @author demo
     * @since 2023/10/25
     */
    String payment();
}

2、策略接口实现,3种支付方式

支付宝

@Service
public class AlipayPaymentServiceImpl implements UserPaymentService {
    @Override
    public String payment() {
        // 具体逻辑
        return "支付宝支付";
    }
}

微信支付

@Service
public class WechatPaymentServiceImpl implements UserPaymentService {
    @Override
    public String payment() {
        // 具体逻辑
        return "微信支付";
    }
}

银行卡支付

@Service
public class BankCardPaymentServiceImpl implements UserPaymentService {
    @Override
    public String payment() {
        // 具体逻辑
        return "银行卡支付";
    }
}

四、工厂模式

1、工厂

工厂类 UserPaymentFactory

@Component
public class UserPaymentFactory {

    @Autowired
    private Map<String, UserPaymentService> paymentServiceMap = new ConcurrentHashMap<>();

    public UserPaymentService getPayment(Integer paymentType) {
        String serviceName = UserPaymentStrategyTypeEnum.getServiceName(paymentType);
        return paymentServiceMap.get(serviceName);
    }
}

Spring 会自动将 UserPaymentService接口的实现类注入到这个Map中。需要你这个类得交给Spring 容器进行管理

2、枚举类

枚举进行策略实现类的管理

@Getter
@AllArgsConstructor
public enum UserPaymentStrategyTypeEnum {
    /**
     * 支付宝支付
     */
    ALIPAY(1, "支付宝支付", "alipayPaymentServiceImpl"),

    /**
     * 微信支付
     */
    WECHAT(2, "微信支付", "wechatPaymentServiceImpl"),

    /**
     * 银行卡支付
     */
    BANK_CARD(3, "银行卡支付", "bankCardPaymentServiceImpl");

    private final Integer code;

    private final String desc;

    private final String strategyService;

    /**
     * 获取strategyService
     *
     * @param code code
     * @return java.lang.String
     * @author demo
     * @since 2023/10/25
     */
    public static String getServiceName(Integer code){
        for (UserPaymentStrategyTypeEnum en : values()) {
            if (en.getCode().equals(code)) {
                return en.getStrategyService();
            }
        }
        return "";
    }
}

重点
重点
重点
枚举中的strategyService就是对应Spring管理对应的值,strategyService对应的枚举值就是你策略实现类的名字,小写打头

五、效果

写了一个Controller进行调用

@RestController
public class StrategyController {

    @Autowired
    private UserPaymentFactory userPaymentFactory;

    /**
     * 获取支付方式
     *
     * @param paymentType paymentType
     * @return java.lang.String
     * @author demo
     * @since 2023/10/25
     */
    @GetMapping("/getPaymentType")
    public String demoController(@RequestParam("paymentType") Integer paymentType) {
        return userPaymentFactory.getPayment(paymentType).payment();
    }
}

效果:
在这里插入图片描述

Over

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值