天天看點

Java 23種設計模式之政策模式

1. 概念

它定義了算法家族,分别封裝起來,讓她們之間可以替換,次模式讓算法的變化,不會影響到使用算法的客戶。
           

2. 定義所有支援的算法的公共接口或者抽象類 商品收費類

public abstract class CashSuper {

    public abstract double acceptCash(double money);
}
           

3. 封裝具體的算法

1. 正常收費具體類
public class CashNormal extends CashSuper{

    @Override
    public double acceptCash(double money) {
        return money;
    }

}

2.打折收費類
public class CashRebate extends CashSuper{

    private double discount;
    public CashRebate(String discount){
        this.discount = Double.valueOf(discount);
    }

    @Override
    public double acceptCash(double money) {
        return money * discount;
    }
}

3.滿多少返多少收費類
public class CashReturn extends CashSuper{

    //返利條件
    private double moneyCondition;
    //返價多少
    private double moneyReturn;
    public CashReturn(String moneyCondition,String moneyReturn){
        this.moneyCondition = Double.valueOf(moneyCondition);
        this.moneyReturn = Double.valueOf(moneyReturn);
    }

    @Override
    public double acceptCash(double money) {
        double result = money;
        if(money >= moneyCondition){
            result = money - Math.floor(money / moneyCondition) * moneyReturn;
        }
        return result;
    }
}
           

4. 建立一個Context類,維護一個公共接口或者抽象類的引用

public class CashContext {

    private CashSuper cashSuper;
    public CashContext(CashSuper cashSuper){
        this.cashSuper = cashSuper;
    }

    /**
     * 傳回的最終價格
     * @param money
     * @return
     */
    public double getResult(double money){
        return cashSuper.acceptCash(money);
    }
}
           

5. 政策模式與簡單工廠模式相結合

public class CashContextImprove {

    private CashSuper cash;
    public CashContextImprove(String type){
        switch (type){
            case "正常收費":
                cash = new CashNormal();
                break;
            case "打8折":
                cash = new CashRebate("0.8");
                break;
            case "滿500返100":
                cash = new CashReturn("500","100");
                break;
            case "滿800返200":
                cash = new CashReturn("800","200");
                break;
        }
    }

    /**
     * 傳回的最終價格
     * @param money
     * @return
     */
    public double getResult(double money){
        return cash.acceptCash(money);
    }
}
           

6. 測試類

1.政策模式
@org.junit.Test
public void test1(){

    double totalPrice;
    CashContext cc;

    cc = selectDiscount("正常收費");
    totalPrice = cc.getResult(500);
    System.out.println("正常收費價格:"+totalPrice);

    cc = selectDiscount("打8折");
    totalPrice = cc.getResult(500);
    System.out.println("打8折價格:"+totalPrice);

    cc = selectDiscount("滿500返100");
    totalPrice = cc.getResult(500);
    System.out.println("滿500減100價格:"+totalPrice);
}


public CashContext selectDiscount(String discount){
    CashContext cashContext = null;
    switch (discount){
        case "正常收費":
            cashContext = new CashContext(new CashNormal());
            break;
        case "打8折":
            cashContext = new CashContext(new CashRebate("0.8"));
            break;
        case "滿500返100":
            cashContext = new CashContext(new CashReturn("500","100"));
            break;
    }

    return cashContext;
}

2. 政策模式與簡單工廠模式相結合
@org.junit.Test
public void test2(){
    CashContextImprove cci;
    double totalPrice;

    cci = new CashContextImprove("正常收費");
    totalPrice = cci.getResult(500);
    System.out.println("正常收費價格:"+totalPrice);

    cci = new CashContextImprove("打8折");
    totalPrice = cci.getResult(500);
    System.out.println("打8折價格:"+totalPrice);

    cci = new CashContextImprove("滿800返200");
    totalPrice = cci.getResult(900);
    System.out.println("滿500返100價格:"+totalPrice);
}
           

7.小結

政策模式的優點是簡化了單元測試,因為每一個算法都有自己的類,可以通過自己的接口單獨測試,政策模式封裝了變化。
           

繼續閱讀