为了加深对策略模式的理解,本节在来学习一个实例。相信小伙伴们都用过支付宝、微信支付、银联支付及京东白条,常见的应用场景就是大家在下单支付时会提示选择支付方式,如果没有选择支付方式,系统会用默认推荐的支付方式进行结算。
下面我们使用策略模式来模拟此业务场景,类图如下。
首先创建 Payment 抽象类,定义支付规范和支付逻辑,代码如下。
public abstract class Payment {
public abstract String getName();
//通用逻辑放到抽象类里面实现
public MsgResult pay(String uid, double amount) {
//余额是否足够
if (queryBalance(uid) < amount) {
return new MsgResult(500, "支付失败", "余额不足");
}
return new MsgResult(200, "支付成功", "支付金额" + amount);
}
protected abstract double queryBalance(String uid);
}
然后分别创建具体的支付方式,支付宝 AliPay 类的代码如下。
public class AliPay extends Payment {
public String getName() {
return "支付宝";
}
protected double queryBalance(String uid) {
return 900;
}
}
京东白条 JDPay 类的代码如下。
public class JDPay extends Payment {
public String getName() {
return "京东白条";
}
protected double queryBalance(String uid) {
return 500;
}
}
微信支付 WeChatPay 类的代码如下。
public class WeChatPay extends Payment {
@Override
public String getName() {
return "微信支付";
}
@Override
protected double queryBalance(String uid) {
return 263;
}
}
银联支付 UnionPay 类的代码如下。
public class UnionPay extends Payment {
@Override
public String getName() {
return "银联支付";
}
@Override
protected double queryBalance(String uid) {
return 120;
}
}
创建支付状态的包装类 MsgResult。
public class MsgResult {
private int code;
private Object data;
private String msg;
public MsgResult(int code, String msg, Object data) {
this.code = code;
this.data = data;
this.msg = msg;
}
@Override
public String toString() {
return "MsgResult{" +
"code=" + code +
", data=" + data +
", msg='" + msg + '\'' +
'}';
}
}
创建支付策略管理类。
import java.util.HashMap;
import java.util.Map;
public class PayStrategy {
public static final String ALI_PAY = "AliPay";
public static final String JD_PAY = "JdPay";
public static final String WECHAT_PAY = "WeChatPay";
public static final String UNION_PAY = "UnionPay";
public static final String DEFAULT_PAY = ALI_PAY;
private static Map strategy = new HashMap();
static {
strategy.put(ALI_PAY, new AliPay());
strategy.put(JD_PAY, new JDPay());
strategy.put(WECHAT_PAY, new WeChatPay());
strategy.put(UNION_PAY, new UnionPay());
}
public static Payment get(String payKey) {
if (!strategy.containsKey(payKey)) {
return strategy.get(DEFAULT_PAY);
}
return strategy.get(payKey);
}
}
创建订单 Order 类。
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;
}
public MsgResult pay() {
return pay(PayStrategy.DEFAULT_PAY);
}
public MsgResult pay(String payKey) {
Payment payment = PayStrategy.get(payKey);
System.out.println("欢迎使用" + payment.getName());
System.out.println("本次交易金额为" + amount + ",开始扣款");
return payment.pay(uid, amount);
}
}
最后编写客户端测试代码。
public class Test {
public static void main(String[] args) {
Order order = new Order("1", "2323235655956", 325);
System.out.println(order.pay(PayStrategy.ALI_PAY));
}
}
运行结果如下所示。
欢迎使用支付宝
本次交易金额为325.0,开始扣款
MsgResult{code=200, data=支付金额325.0, msg='支付成功'}
通过《策略模式实现选择促销优惠方案》和《策略模式实现选择支付方式场景》等常见的业务场景举例,希望小伙伴们能够更深刻地理解策略模式。