策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。
策略模式的类图:
在支付业务中,有三种付款方式,程序运行时使用哪种方式由用户选择,根据用户选择执行不同的逻辑。
public interface PaymentStrategy {
public void payment(BigDecimal amount);
}
银行卡支付策略
public class CreditPaymentStrategy implements PaymentStrategy{
@Override
public void payment(BigDecimal amount) {
System.out.println("使用银行卡支付" + amount);
// 去调用网联接口
}
}
微信支付策略
public class WechatPaymentStrategy implements PaymentStrategy{
@Override
public void payment(BigDecimal amount) {
System.out.println("使用微信支付" + amount);
// 调用微信支付API
}
}
支付宝支付策略
public class AlipayPaymentStrategy implements PaymentStrategy {
@Override
public void payment(BigDecimal amount) {
System.out.println("使用支付宝支付" + amount);
// 调用支付宝支付API
}
}
public class PaymentService {
/**
* 将strategy作为参数传递给支付服务
*/
public void payment(PaymentStrategy strategy, BigDecimal amount) {
strategy.payment(amount);
}
}
我们将支付策略作为参数传递给支付服务,在支付服务中只需要按照运行时传的支付策略对象进行支付就可以了。
我们来测试一下使用策略模式之后的代码。
public class StrategyTest {
public static void main(String[] args) {
PaymentService paymentService = new PaymentService();
// 使用微信支付
paymentService.payment(new WechatPaymentStrategy(), new BigDecimal("100"));
//使用支付宝支付
paymentService.payment(new AlipayPaymentStrategy(), new BigDecimal("100"));
}
}
运行结果:
在使用了策略模式之后,在我们的支付服务PaymentService中便不需要写复杂的if…else,如果需要新增加一种支付方式,只需要新增一个新的支付策略实现,这样就满足了开闭原则,并且对其他支付方式的业务逻辑也不会造成影响,扩展性很好。
在JDK中最经典的使用策略模式的例子就是Collections.sort(List
方法,这个方法接受一个比较器Compartor参数,客户端在运行时可以传入一个比较器的实现,sort()方法中根据不同实现,按照不同的方式进行排序。