Java设计模式-策略模式(支付业务的优化)

本文通过一个具体的支付系统实例,介绍了如何运用策略模式来避免大量的ifelse判断,简化代码。通过创建支付策略接口和微信、支付宝的实现类,再结合Spring的自动注入,实现了动态选择支付方式的功能。最后通过一个控制器接口进行调用,展示了策略模式在实际项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么情况下使用策略模式

功能类似的业务功能,避免创建多个接口,大量if else 判断逻辑,简化代码

二、我以支付为例(支付方式有微信,支付宝支付)

1、新建策略抽象类或者接口
public interface ThirdPayStrategyService {

    /**
     * 第三方支付接口(微信 支付宝)
     * @param order
     * @param clientIp
     * @return
     */
    Map<String,String> pay(Orders order, String clientIp);

}
2、定义俩个实现类实现当前支付接口

wx支付实现类

@Service("wxPay")
@Slf4j
public class WxPayStrategyServiceImpl implements ThirdPayStrategyService {


    @Override
    public Map<String, String> pay(Orders order, String clientIp) {
        Map<String,String> map=new HashMap<>();
        map.put("success","true");
        map.put("type","wxPay");
        log.info("微信支付启动");
        return map;
    }
}

支付宝支付实现类

@Service("aliPay")
@Slf4j
public class AliPayStrategyServiceImpl implements ThirdPayStrategyService {

    @Override
    public Map<String, String> pay(Orders order, String clientIp) {
        Map<String,String> map=new HashMap<>();
        map.put("success","true");
        map.put("type","aliPay");
        log.info("支付宝支付启动");
        return map;
    }
}
3、定义执行策略类
@Component
@Slf4j
public class ThirdPayStrategyContext {

    @Autowired
    private final Map<String, ThirdPayStrategyService> payMap=new HashMap<>();

    public Map<String,String> pullPay(Integer payType){
        log.info("策略对象={}", payMap);
        return payMap.get(PayTypeEnum.getPayTypeByCode(payType)).pay(new Orders(), "127.0.0.1");
    }

}

俩种支付实现类对象会在spring的加载下自动注入到payMap中,map中key是service的名称 例如:@Service(“aliPay”)value 是对象的地址值

4、接口调用
@RestController
@RequestMapping("/test")
@Slf4j
public class WebController {

    @Autowired
    private ThirdPayStrategyContext thirdPayStrategyContext;

    @GetMapping("/pay/{payType}")
    public String payTest(@PathVariable Integer payType) {
        Map<String, String> result = thirdPayStrategyContext.pullPay(payType);
        log.info("调用支付返回结果={} 传参={}", JSON.toJSONString(result), payType);
        return "success";
    }

}
5、调用结果

在这里插入图片描述

在这里插入图片描述

附:枚举类

public enum PayTypeEnum {

    WX_PAY(1,"wxPay"),
    ALI_PAY(2,"aliPay");


    private Integer code;

    private String payType;

    PayTypeEnum() {
    }

    PayTypeEnum(Integer code, String payType) {
        this.code = code;
        this.payType = payType;
    }

    public Integer getCode(){
        return code;
    }

    public String getPayType(){
        return payType;
    }

    public static String getPayTypeByCode(Integer code){
        PayTypeEnum[] list = PayTypeEnum.values();
        for (PayTypeEnum payTypeEnum : list) {
            if(code.equals(payTypeEnum.code)){
                return payTypeEnum.payType;
            }
        }
        return null;
    }

    public static List<Integer> typeCodeList(){
        ArrayList<Integer> codeList = Lists.newArrayList();
        PayTypeEnum[] list = PayTypeEnum.values();
        for (PayTypeEnum payTypeEnum : list) {
            codeList.add(payTypeEnum.code);
        }
        return codeList;
    }
}

微信支付宝接入

支付模块-接入微信或支付宝

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值