问题:在一般代码中选择微信和支付宝支付,当更换支付类型时需要频繁更改原有代码
一般实现切换支付方式:
接口Pay
public interface Pay {
void payAmount(double amount);
}
微信支付实现类
public class WechatPay implements Pay {
@Override
public void payAmount(double amount) {
System.out.println("微信支付"+amount);
}
}
支付宝支付实现类
public class Alipay implements Pay {
@Override
public void payAmount(double amount) {
System.out.println("支付宝支付"+amount);
}
}
测试代码
public class Test {
public static void main(String[] args) {
//接入支付功能
//微信支付
Pay pay=null;
Pay pay;
pay = new WechatPay();
pay.payAmount(100);
System.out.println("================");
// Pay pay1=null;
pay = new Alipay();
pay.payAmount(100);
}
}
spi机制不改代码实现切换支付方式
步骤:
- 在resources目录下创建META-INF文件夹,接着在下面创建以实现接口的全名为文件名(例如Pay接口的全名)的文档,在该文档下写需要切换的全类名(如:
basic.spi.WechatPay
) - 测试
public class Test {
public static void main(String[] args) {
//接入支付功能
//微信支付
Pay pay=null;
//使用SPI机制
//动态加载、动态发现接口的实现类对象
//这里的ServiceLoader<Pay> 就包含了发现的Pay.class实现类对象的集合
ServiceLoader<Pay> load = ServiceLoader.load(Pay.class);
load.forEach(payObj ->{
payObj.payAmount(100);
});
}