策略模式:例子:比较器,旅行路线,固定算法,网购结算支付
应用场景:根据用户的需求处理数据时需要对算法做出一个选择,选择是固定的一些算法(不变的算法),算法可以扩展,
通常会和抽象工厂模式结合使用
//spring源码中有很多创建bean的factory,例如beanFactory, ListableFactory,用户可以通过配置文件制定使用哪种Factory创建Bean
/**
* 支付渠道
*/
public interface Payment {
//每次增加一个支付渠道,就要维护接口违背开闭
// public final static Payment ALI_PAY = new AliPay();
// public final static Payment WX_PAY = new WxPay();
// public final static Payment JD_Pay = new JDPay();
PayState pay(String uid, double amount);
}
public class WxPay implements Payment {
@Override
public PayState pay(String uid, double amount) {
//固定算法
System.out.println("欢迎使用微信支付");
System.out.println("查询余额,微信红包扣款");
return new PayState(200, "支付成功", "支付金额:" + amount);
}
}
public class AliPay implements Payment {
@Override
public PayState pay(String uid, double amount) {
//固定算法
System.out.println("欢迎使用支付宝");
System.out.println("查询余额,扣款");
return new PayState(200, "支付成功", "支付金额:" + amount);
}
}
public class JDPay implements Payment {
@Override
public PayState pay(String uid, double amount) {
//固定算法
System.out.println("欢迎使用京东白条");
System.out.println("查询余额,白条扣款");
return new PayState(200, "支付成功", "支付金额:" + amount);
}
}
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;
}
//这个参数完全可以用Payment这个接口代替,为什么不用?
//因为可以省去写switch或者if else
//也就是说若是用接口,接口里必须先写好if else来选择支付方式
public PayState pay(PayType payType){
return payType.get().pay(this.uid, this.amount);
}
}
/**
* 姑且把枚举当做常连池来维护
*/
public enum PayType {
ALI_PAY(new AliPay()),
WX_PAY(new WxPay()),
JD_PAY(new JDPay());
private Payment payment;
PayType(Payment payment) {
this.payment = payment;
}
public Payment get() {
return this.payment;
}
}
/**
* 支付完成后的状态
*/
public class PayState {
private int code;
private Object data;
private String msg;
public PayState(int code, Object data, String msg) {
this.code = code;
this.data = data;
this.msg = msg;
}
@Override
public String toString() {
return "PayState{" +
"code=" + code +
", data=" + data +
", msg='" + msg + '\'' +
'}';
}
}
public class PayStrategyTest {
public static void main(String[] args) {
Order order = new Order("1", "1231231", 90.0D);
//开始支付:微信支付,支付宝支付,财付通支付
//每个渠道支付的具体算法是不一样的
//每个支付的算法是固定
System.out.println(order.pay(PayType.JD_PAY));
}
}
运行结果
欢迎使用京东白条
查询余额,白条扣款
PayState{code=200, data=支付成功, msg='支付金额:90.0'}
Process finished with exit code 0
网友评论