設計模式從零開始——策略模式
阿新 • • 發佈:2019-01-12
策略模式和簡單工廠模式從程式碼結構上長得很像,但是經過了我百度了大量的資料已經對兩種模式的程式碼進行對比,
最後總結出:
1、策略模式和簡單工廠模式都是總分的結構,即通過總的排程介面去判斷具體實現哪一種功能——相同點;
2、簡單工廠模式的每種實視想法是從功能實現角度出發,每一個實現類都是為了完成某一項功能,
策略模式的每種實現本質是從演算法角度出發,每一個實現類是為了實現某一項邏輯功能——不同點
以下是以商場打折為背景,使用策略模式實現不同的打折方式的程式碼:
打折演算法的父類:
public abstract class CashSuper { 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; public CashRebate(String moneyRebate) { this.moneyRebate = Double.parseDouble(moneyRebate); } @Override public double acceptCash(double money) { return money * moneyRebate; } }
滿額返現演算法:
public class CashRerurn extends CashSuper { private double moneyCondition = 0.0d; private double moneyReturn = 0.0d; public CashRerurn(String moneyCondition, String moneyReturn) { this.moneyCondition = Double.parseDouble(moneyCondition); this.moneyReturn = Double.parseDouble(moneyReturn); } @Override public double acceptCash(double money) { double result = money; if (money >= moneyCondition) { result = money - Math.round(money / moneyCondition * moneyReturn); } return result; } }
演算法工廠類:
public class CashContext {
CashSuper cs = null;
public CashContext(String type) {
switch (type) {
case "正常收費":
CashNormal cs0 = new CashNormal();
cs = cs0;
break;
case "滿300飯100":
CashRerurn cr1 = new CashRerurn("300", "100");
cs = cr1;
break;
case "打8折":
CashRebate cr2 = new CashRebate("0.8");
cs = cr2;
break;
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}
客戶呼叫程式:
public class Sale {
static double total = 0.0d;
private static void btnOK_Click() {
CashContext csuper = new CashContext("滿300飯100");
double totalPrices = 0d;
totalPrices = csuper.getResult(400);
total = total + totalPrices;
System.out.println("總價:" + total);
}
public static void main(String[] args) {
btnOK_Click();
}
}
以上程式碼通過和上一篇簡單工廠設計模式的例子相對比,可以發現簡單工廠的例子中,具體實現的加減乘除四種運算方式只是四種簡單的功能,
在簡單工廠模式中,具體的實現類也是隻考慮功能的實現
而策略模式中,結合著簡單工廠模式的總分結構,對應每個具體實現都變成了帶有邏輯的演算法,通過客戶端呼叫的時候,也是執行具體的邏輯功能,
而不是像加減乘除這樣簡單的功能實現
這樣實現的好處在於商場無論是打5折還是打9折,在程式中的體現就是改變客戶端呼叫打折演算法時傳遞的引數,不再需要對於5折,9折寫兩個不同的功能實現類,
將最本質的功能整體抽象出來,使程式碼修改起來更加靈活