策略模式是指定義了算法家族並將其封裝起來,讓它們之間可以相互替換,而不影響使用此算法的用戶。
策略模式的應用場景如下
-
系統中有很多類,這些類之間區別僅僅在於行爲不同。
-
一個系統需要動態的在幾種算法中選擇其中的一種來執行。
舉個例子,基本所有的人都有在網上買過東西(比如 服裝、書、車票等),在我們選中某個或者某些商品之後,選擇付款時會讓我們選擇付款方式,如:支付寶、銀聯、微信等,也可能支持第三方的支付。那就以買書寫一個小小的例子來簡單瞭解下策略模式:
1、創建支付狀態包裝類,即返回到前臺的信息封裝。
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;
}
public String toString(){
return "支付狀態:["+ code +"]," + msg + ",交易詳情:" + data ;
}
}
2、創建支付抽象類 Payment
public abstract class patment {
// 支付類型
public 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 );
}
}
3、以下分別創建各種支付方式:
支付寶支付類
public class AliPay extends Payment {
public String getName(){
return "支付寶";
}
public double queryBalance(String uid){
return 900;
}
}
微信支付類
public class WechatPay extends Payment {
public String getName(){
return "微信";
}
public double queryBalance(String uid){
return 365;
}
}
銀聯支付類
public class UnionPay extends Payment {
public String getName(){
return "銀聯";
}
public double queryBalance(String uid){
return 120;
}
}
4、創建支付策略管理類
public class PayStrategy{
public static final String ALI_PAY = "AliPay";
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<String, Payment> payStrategy = new HashMap<String,Payment>();
static{
payStrategy.put(ALI_PAY,new AliPay());
payStrategy.put(WECHAT_PAY,new WechatPay());
payStrategy.put(UNION_PAY,new UnionPay());
}
public static Payment get(String payKey){
if(!payStrategy.containsKey(payKey)){
return payStrategy.get(DEFAULT_PAY);
}
return payStrategy.get(payKey);
}
}
5、創建訂單 order 類
public class Order{
private String uid;
private Stirng orderId;
private double amount;
public Order(String uid, String orderId orderId, double amount){
this.uid = uid;
this.orderId = orderId;
this.amount = amount;
}
// 解決了代碼中的 switch 或者 if else
public Payment pay(){
return pay(PayStrategy.DEFAULT_PAY);
}
public Payment pay(String payKey){
Payment payment = PayStrategy.get(payKey);
System.out.println("歡迎使用:"payment.getName());
System.out.println("本次交易金額爲:" + amount + ",開始扣款……");
return payment.pay(uid,amount);
}
}
6、測試代碼如下:
public static void main(String[] args){
// 爲節約代碼量 專注於策略模式,此處省略把商品添加到購物車,再從購物車下單。直接從訂單開始
Order order = new Order("1","201908181922401524",324.5);
// 開始支付,可以選擇支付寶、微信、銀聯中的任意一種
// 後期如若添加京東、華爲等新的支付渠道,只需創建一個新的支付類,及常量即可。
System.out.println(order.pay(PayStrategy.ALI_PAY));
}
控制檯輸出如下:
歡迎使用支付寶
本次交易金額爲:324.5,開始扣款……
支付狀態:[200],支付成功,交易詳情:支付金額:324.5
策略模式簡介到你結束,此篇博文只作爲簡單的瞭解。