策略,也可以说是方法
比如:出去吃顿饭选择步行还是驾车,付款时选择用支付宝还是微信,餐具用筷子还是刀叉等等诸如此类。
总之我们的方法有很多种
策略模式
引申进代码中,把这些策略(Strategy)给抽出来,整成一个接口,这里以支付场景为例
/**
* 定义支付策略接口,让代码更加通用
*/
public interface PayStrategy {
/**
* 执行付款
* @param payContext
*/
void doPay(PayContext payContext);
}
这里我定义了一个简单支付信息上下文PayContext
public class PayContext {
/**
* 付款人
*/
private Long userID;
/**
* 付款方式(支付宝/微信)
*/
private String payMethod;
/**
* 付款金额
*/
private int moneyPay;
}
现在只剩下一个工作了,即写微信支付方法(wxPay)和支付宝支付方法(zfbPay)
public class wxPay implements PayStrategy {
@Override
public void doPay(PayContext payContext) {
Long userID = payContext.getUserID();
int moneyPay = payContext.getMoneyPay();
System.out.println("这里是微信方法");
System.out.println("支付人:"+userID+"支付金额:"+moneyPay);
}
}
public class zfbPay implements PayStrategy {
@Override
public void doPay(PayContext payContext) {
Long userID = payContext.getUserID();
int moneyPay = payContext.getMoneyPay();
System.out.println("这里是支付宝方法");
System.out.println("支付人:"+userID+"支付金额:"+moneyPay);
}
}
理论上已经完成了,但是如果调用方使用时还需要写个if else判断payMethod是支付宝还是微信,因此,这里我们定义一个PayManager,目的是简化对支付功能的调用,让调用方写最少的代码,调用最简单。对于支付方式的选取,也是在这里处理的
@Service
public class PayManager {
void doPay(PayContext payContext){
String payMethod = payContext.getPayMethod();
PayStrategy payStrategy = null;
if ("微信".equals(payMethod)){
payStrategy = new wxPay();
}else if ("支付宝".equals(payMethod)){
payStrategy = new zfbPay();
}
payStrategy.doPay(payContext);
}
}
最后在PayManager这个类下按CTRL+shift+T,创建测试
class PayManagerTest {
@Test
void doPay() {
PayContext payContext = new PayContext();
payContext.setUserID(123L);
payContext.setPayMethod("支付宝");
payContext.setMoneyPay(100);
PayManager payManager = new PayManager();
payManager.doPay(payContext);
}
}
输出结果
demo结构图