策略模式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>對象.