策略模式結合簡單工廠模式
阿新 • • 發佈:2019-02-15
簡單工廠模式 program 多少 spa type 滿足 cond out 策略模式
概述
策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少各種算法類與使用算法類之間的耦合。
場景
超市收營員收錢,有打幾折、滿多少返現、正常收費等活動來最終算出客戶應該付多少現金。
1.現金收款超類
package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: 現金收款超類 * @author: gaozhiyuan * @create: 2019-02-13 23:23 */ interfaceCashSuper { double acceptMoney(double money); }
2.正常收費
package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: normal accept money * @author: gaozhiyuan * @create: 2019-02-13 23:30 */ public class CashNormal implements CashSuper { @Override publicdouble acceptMoney(double money) { return money; } }
3.打折
package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: rebate accept money * @author: gaozhiyuan * @create: 2019-02-13 23:31 */ class CashRebate implements CashSuper{ private doublerebate; public CashRebate() { } public CashRebate(double rebate) { this.rebate = rebate; } @Override public double acceptMoney(double money) { return money*this.rebate; } }
4.滿多少返現
package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: 返現 * @author: gaozhiyuan * @create: 2019-02-13 23:34 */ public class CashReturn implements CashSuper { //滿足的條件 private double moneyCondition; //返現金額 private double moneyReturn; public CashReturn() { } public CashReturn(double moneyCondition, double moneyReturn) { this.moneyCondition = moneyCondition; this.moneyReturn = moneyReturn; } @Override public double acceptMoney(double money) { double result = money; if(money >= this.moneyCondition){ result = money - this.moneyReturn; } return result; } }
5.策略模式結合簡單工廠類,可根據傳入活動類型寫死活動內容,也可通過不同的構造函數確定活動。
package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: * @author: gaozhiyuan * @create: 2019-02-13 23:40 */ public class CashContext { CashSuper cashSuper; public CashContext(String type) {//傳入打折或返現類型 switch (type) { case "normal": cashSuper = new CashNormal(); break; case "rebate": cashSuper = new CashRebate(0.8); break; case "return": cashSuper = new CashReturn(300,100); break; } this.cashSuper = cashSuper; } public CashContext(){ cashSuper = new CashNormal(); } public CashContext(double rebate){ cashSuper = new CashRebate(rebate); } public CashContext(double moneyCondition,double moneyReturn){ cashSuper = new CashReturn(moneyCondition,moneyReturn); } public double acceptMoney(double money){ return cashSuper.acceptMoney(money); } }
6,測試類
package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: test * @author: gaozhiyuan * @create: 2019-02-13 23:56 */ public class Test { public static void main(String[] args) { CashContext cashContext = new CashContext(300,100); // CashContext cashContext = new CashContext(0.8); // CashContext cashContext = new CashContext(); double result = cashContext.acceptMoney(1000); //根據活動算出最終該付多少錢 System.out.println(result); // } }
測試結果
900.0
Process finished with exit code 0
策略模式結合簡單工廠模式