1. 程式人生 > >策略模式精講

策略模式精講

import ring 銀聯支付 微信 out 處理 rate 替換 ()

策略模式是一種行為型模式,他的特點就是執行流程固定,但中間的步驟有一些差別;運行的時候才確定。官方的意思是:定義一系列的算法,把它們一個個封裝起來, 並且使它們可相互替換。下面使用窮舉法舉幾個簡單理解的例子:

1.諸葛亮的錦囊妙計,每一個錦囊就是一個策略.

2.旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。

3.固定算法的封裝等等。

4.網上購物買東西選擇支付方式。

場景:根據用戶的需求處理數據時候需要對算法做出選擇,固定的一些算法,但是可以擴展。

下面有一個選擇支付方式的代碼進行演示:

package pattern.strategy.pay.payport;
import
pattern.strategy.pay.PayState; /** * 支付渠道 */ public interface Payment { public PayState pay(String uid,double amount); }
package pattern.strategy.pay.payport;
public enum  PayType {
    ALI_PAY(new AliPay()),
    WECHAT_PAY(new WechatPay()),
    UNION_PAY(new UnionPay()),
    JD_PAY(new JDPay());
    
private Payment payment;
PayType(Payment payment){
this.payment=payment; } public Payment get(){ return this.payment; } }
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class AliPay implements Payment {
    @Override
    public PayState pay(String uid, double
amount) { System.out.println("歡迎使用支付寶"); System.out.println("查詢賬戶余額,開始扣款"); return new PayState(200,"支付成功",amount); } }
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class JDPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("歡迎使用京東支付");
        System.out.println("查詢賬戶余額,開始扣款");
        return new PayState(200,"支付成功",amount);
    }
}
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class UnionPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("歡迎使用銀聯支付");
        System.out.println("查詢賬戶余額,開始扣款");
        return new PayState(200,"支付成功",amount);
    }
}
package pattern.strategy.pay.payport;
import pattern.strategy.pay.PayState;
public class WechatPay implements Payment {
    @Override
    public PayState pay(String uid, double amount) {
        System.out.println("歡迎使用微信支付");
        System.out.println("查詢賬戶余額,開始扣款");
        return new PayState(200,"支付成功",amount);
    }
}
package pattern.strategy.pay;
import pattern.strategy.pay.payport.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;
    }

    public PayState pay(PayType payType){
       return payType.get().pay(this.uid,this.amount);
    }

}
package pattern.strategy.pay;

public class PayState {

    private int code;
    private Object data;
    private String msg;

    public PayState(int code,String msg,Object data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }

    public String toString() {
        return ("支付狀態:["+code+"],"+msg+",交易詳情:"+data);
    }
}
package pattern.strategy;
import pattern.strategy.pay.Order;
import pattern.strategy.pay.payport.PayType;
public class StrategyTest {
    public static void main(String[] args) {
        Order order=new Order("1","22233333",320);
        System.out.println(order.pay(PayType.ALI_PAY));
    }
}

測試結果:

歡迎使用支付寶
查詢賬戶余額,開始扣款
支付狀態:[200],支付成功,交易詳情:320.0

策略模式精講