策略模式是定义了算法家族并分别封装起来,让它们之间可以相互替换,此模式是的算法的变化不会影响使用算法的用户
1.策略模式的应用场景
1.系统中有很多类他们的区别仅仅在于行为的不同
2.一个系统需要动态的在集中算法中选择一种
2.策略模式业务场景
首先创建支付状态包装类
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);
}
}
创建支付抽象类,用于定义支付规范和支付逻辑
public abstract class Payment {
//支付类型
public abstract String getName();
//查询余额
protected abstract double queryBalance(String uid);
public PayState pay(String uid,double amount){
if(queryBalance(uid)<amount) {
return new PayState(500,"支付失败","余额不足");
}
return new PayState(200,"支付成功","支付金额"+amount);
}
}
分别创建具体的支付方式
public class AliPay extends Payment {
@Override
public String getName() {
return "支付宝";
}
@Override
protected double queryBalance(String uid) {
return 900;
}
}
public class JDPay extends Payment {
@Override
public String getName() {
return "京东白条";
}
@Override
protected double queryBalance(String uid) {
return 500;
}
}
public class UnionPay extends Payment {
@Override
public String getName() {
return "银联支付";
}
@Override
protected double queryBalance(String uid) {
return 120;
}
}
public class WechatPay extends Payment {
@Override
public String getName() {
return "微信支付";
}
@Override
protected double queryBalance(String uid) {
return 256;
}
}
创建支付策略管理类
public class PayStrategy {
public static final String ALI_PAY="AliPay";
public static final String JD_PAY="JdPay";
public static final String UNION_PAY="UnionPay";
public static final String WECHAT_PAY="WechatPay";
public static final String DEFAULT_PAY=ALI_PAY;
private static Map<String,Payment> payStrategy = new HashMap<String,Payment>();
static {
payStrategy.put(ALI_PAY,new AliPay());
payStrategy.put(JD_PAY,new JDPay());
payStrategy.put(UNION_PAY,new UnionPay());
payStrategy.put(WECHAT_PAY,new WechatPay());
}
public static Payment get(String payKey) {
if(!payStrategy.containsKey(payKey)) {
return payStrategy.get(DEFAULT_PAY);
}
return payStrategy.get(payKey);
}
}
创建订单类
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 PayState pay() {
return pay(PayStrategy.DEFAULT_PAY);
}
public PayState pay(String paykey) {
Payment payment = PayStrategy.get(paykey);
System.out.println("欢迎使用"+payment.getName());
System.out.println("本次交易金额为"+amount);
return payment.pay(uid, amount);
}
}
进行测试
public class PayStrategyTest {
public static void main(String args[]) {
Order order = new Order("1", "0000001",324.25);
System.out.println(order.pay(PayStrategy.JD_PAY));
}
}
测试结果为
欢迎使用京东白条
本次交易金额为324.25
支付状态:[200],支付成功,交易详情支付金额324.25
3.策略模式的优缺点
策略模式优点如下:
1.策略模式符合开闭原则
2.策略模式可避免使用多重条件语句如If…else语句,switch语句
3.使用策略模式可以提高算法的保密性和安全性
策略模式缺点如下:
1.客户端必须知道所有策略并自行决定使用哪一个策略
2.代码中会产生非常多的策略类,增加了维护难度