大話設計模式讀書筆記系列-2.策略模式

>>>大話設計模式讀書筆記系列目錄>>>

策略模式html

它定義了算法家族,分別封裝起來,讓他們之間能夠互相轉換,此模式讓算法的變化,不會影響到使用算法的客戶算法

 

場景:設計模式

商場售賣商品的時候針對不一樣場景指定不一樣的折扣策略(原價消費/折扣消費/返利消費),經過構建不一樣的對象來實現不一樣策略切換.ide

 

收費抽象類
/**
 * 現金收費抽象類
 */
public abstract class CashSuper {
    /**
     * 現金收取超類的抽象方法,收取現金
     * @param money 原價
     * @return 當前價
     */
    public abstract double acceptCash(double money);
}

 

收費子類
/**
 * 正常收費子類
 */
public class CashNormal extends CashSuper {
    @Override
    public double acceptCash(double money) {
        return money;//正常原價返回
    }
}

/**
 * 打折收費子類
 */
public class CashRebate extends CashSuper {

    /**
     * 費率
     */
    private double moneyRebate = 1d;

    /**
     * 打折收費,初始化時,必須輸入折扣率,如八折,就是0.8
     *
     * @param moneyRebate
     */
    public CashRebate(String moneyRebate) {
        this.moneyRebate = Double.valueOf(moneyRebate);
    }

    @Override
    public double acceptCash(double money) {
        return money * this.moneyRebate;
    }
}

/**
 * 返利收費子類
 */
public class CashReturn extends CashSuper {

    /**
     * 返利條件,即知足X元
     */
    private double moneyCondition = 0.0d;
    /**
     * 返利金額,即知足條件之後返還X元
     */
    private double moneyReturn = 0.0d;

    /**
     * 返利收費,初始化時必須輸入返利條件和返利金額,好比滿300元減100元,則moneyCondition=300,moneyReturn=100
     *
     * @param moneyCondition 返利條件
     * @param 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 > this.moneyCondition) {
            //結果=總消費金額-(總金額整除返利條件)*返還金額,例如消費910元,610=910-(910/300)*100
            result = money - (int) Math.floor(money/this.moneyCondition) * this.moneyReturn;
        }
        return result;
    }
}

 

策略上下文類
/**
 * 策略上下文類
 */
public class CashContext {

    /**
     * 策略
     */
    private CashSuper cs;

    /**
     * 初始化要使用的策略
     *
     * @param cSuper
     */
    public CashContext(CashSuper cSuper) {
        this.cs = cSuper;
    }

    /**
     * 得到計算結果
     *
     * @param money
     */
    public double GetResult(String money) {
        return this.cs.acceptCash(Double.valueOf(money));
    }
}

 

調用端post

public class StrategyPatternDemo {
    public static void main(String[] args) {
        //返回結果
        double total = 0.0d;
        //採用正常收費策略
        total = new CashContext(new CashNormal()).GetResult("910");
        System.out.println("採用正常收費策略:" + total);
        //採用打折收費策略
        total = new CashContext(new CashRebate("0.8")).GetResult("910");
        System.out.println("採用打折收費策略:" + total);
        //採用返利收費策略
        total = new CashContext(new CashReturn("300", "100")).GetResult("910");
        System.out.println("採用返利收費策略:" + total);
    }
}

 

結果單元測試

採用正常收費策略:910.0
採用打折收費策略:728.0
採用返利收費策略:610.0

 

解析:測試

1.策略模式是一種定義一系列算法的方法,從概念上來看,全部這些算法完成的都是相同的工做,只是實現不一樣,他能夠以相同的方式調用全部的算法,減小了各類算法類與使用算法類之間的耦合.this

2.策略模式的<CashSuper>類層次爲<CashContext>定義了一系列的可重用的算法或行爲.繼承有助於析取出這些算法中的公共功能.url

3.策略模式的優勢是簡化了單元測試,由於每一個算法都有本身的類,能夠經過本身的接口單獨測試.spa

4.當不一樣的行爲堆砌再一個類中時,很難避免使用條件語句來進行選擇合適的行爲,將這些行爲封裝在一個個獨立的<CashSuper>中,能夠在使用這些行爲的類中消除條件語句.

5.策略模式就是用來封裝算法的,但在實踐中,咱們發現能夠用他來封裝幾乎任何類型的規則,只要在分析過程當中聽到須要再不一樣時間應用不一樣的業務規則,就能夠考慮使用策略模式出來這種變化的可能性.

6.基本的策略模式中,選擇所用具體實現的職責由客戶端對象承擔,並轉發給策略模式的<CashContext>對象.

相關文章
相關標籤/搜索