策略模式

本文详细介绍了策略模式在支付系统中的应用,通过实例展示了如何利用策略模式处理多种支付渠道,包括支付宝和微信支付。文章探讨了三种实现策略模式的方法:通过Spring框架的InitializingBean接口、使用SPI机制和服务加载器,以及利用JavaEE的@PostConstruct注解。

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

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。–维基百科
在项目中时常会用到策略模式的场景,比如业务中需要支付,但是有多个支付渠道,那如何对上层业务暴露"统一口径"(接口)呢,下面结合代码说明,
首先定义支付接口:

public interface Pay{
    // 具体支付业务逻辑
    public void toPay();
    // 支付类型
    public Integer payType();
}

AliPay:

public class AliPay implements Pay{
    public void toPay(){
        ...
    }
    public Integer payType(){
        // 返回支付类型枚举
        return 1;
    }
}

WxPay:

public class WxPay implements Pay{
    public void toPay(){
        ...
    }
    public Integer payType(){
        // 返回支付类型枚举
        return 2;
    }
}

不同的实现已经好了,需要在上层业务中传入不同的支付类型,调用具体的实现,结合在Spring项目中使用方式:

@Component
public class PayTypeUtil implements InitializingBean{
    @Autowired
    private List<Pay> payList;
    private static final Map<Integer,Pay> payMap = Maps.newHashMap();
    @Override
    public void afterPropertiesSet() throws Exception {
        for (Pay pay : payList) {
            payMap.put(pay.payType(),pay);
        }
    }
    public Pay getPayService(Integer payType){
        return payMap.get(payType);
    }
    public static void putService(Pay pay){
        payMap.put(pay.payType(),pay);
    }
}

直接使用PayTypeUtil的getPayService方法传入不同的支付类型便可得到具体的实现,上面借助了Spring中的InitializingBean接口实现了在bean初始化时,加载Pay所有的实现类(InitializingBean可参考文章https://blog.youkuaiyun.com/BAT_os/article/details/81844985),难道只有这种方法才可以实现么,当然不是,下面再介绍两种方法:

1. 在META-INF/services中添加文件com.xxx.BaseApplication,并写入com.xxx.AliPay,com.xxx.WxPay
2. 获取Pay所有实现,并注册
ServiceLoader<Pay> payLoader = ServiceLoader.load(Pay.class);
for(Pay pay:payLoader){
    PayTypeUtil.putService(pay);
}
public class AliPay implements Pay{
    @PostConstruct
    public void init(){
       PayTypeUtil.putService(this); 
    }
    public void toPay(){
        ...
    }
    public Integer payType(){
        // 返回支付类型枚举
        return 1;
    }
}
public class WxPay implements Pay{
    @PostConstruct
    public void init(){
       PayTypeUtil.putService(this); 
    }
    public void toPay(){
        ...
    }
    public Integer payType(){
        // 返回支付类型枚举
        return 2;
    }
}

以上简单说明策略模式的用法,根据实际的业务场景结合使用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值