1.策略模式使用场景
策略模式注重的是对算法的封装,用户不需要知道每个算法的实现细节,之需要给用户提供不同算法的选择权。例如支付场景支持支付宝、微信、银联、财付通,用户只需要从中选择一种方式进行支付即可。
使用策略模式可以减少代码中if-else判断逻辑,可以更好的进行扩展。
2.代码实现
定义策略接口类,及其实现类
import com.william.javacore.pattern.strategy.PayState;
//策略接口类
public interface Payment {
PayState pay(String uid, double amount);
}
import com.william.javacore.pattern.strategy.PayState;
public class AliPay implements Payment {
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用支付宝");
System.out.println("查询账户余额,开始扣款");
return new PayState(200,"支付成功",amount);
}
}
import com.william.javacore.pattern.strategy.PayState;
public class JDPay implements Payment {
public PayState pay(String uid, double amount) {
System.out.println("欢迎使用京东白条");
System.out.println("查询账户余额,开始扣款");
return new PayState(200,"支付成功",amount);
}
}
package com.william.javacore.pattern.strategy;
public class PayState {
private int code;
private Object data;
private String msg;
public PayState(int code, String msg,Object data) {
this.code = code;
this.data = data;
this.msg = msg;
}
public String toString(){
return ("支付状态:[" + code + "]," + msg + ",交易详情:" + data);
}
}
import com.william.javacore.pattern.strategy.paytype.PayType;
public class Order {
private String uid;
private String orderId;
private double amount;
public Order(String uid,String orderId,double amount){
this.uid = uid;
this.orderId = orderId;
this.amount = amount;
}
//payType这个参数,完全可以用Payment这个接口来代替
//那么需要将Payment作为一个成员变量,然后在有参构造函数中对Payment进行复制
public PayState pay(PayType payType){
return payType.get().pay(this.uid,this.amount);
}
}
测试:
import com.william.javacore.pattern.strategy.paytype.PayType;
import java.util.ArrayList;
import java.util.List;
public class PayTest {
public static void main(String[] args) {
// 选购商品,点击订单支付
Order order = new Order("1","2018120381489799722801",69.50);
/**
* 各种支付方式,支付算法已经提前封装好了,用户不需要关心算法的实现
* 只需要做出适当的选择即可。
*/
System.out.println(order.pay(PayType.ALI_PAY));
System.out.println(order.pay(PayType.JD_PAY));
}
}
3.源码中的体现
例如Spring的aop实现中,当判断是使用jdk动态代理,还是使用cglib动态代理时,就是根据策略模式进行的。