模式的定義 策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。 使用場景 針對同一類型問題的多種處理方式,僅僅是具體行為有差別時。 需要安全的封裝多種同一類型的操作時。 出現同一抽象多個子類,而又需要使用if-else 或者 sw ...
模式的定義
策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。
使用場景
- 針對同一類型問題的多種處理方式,僅僅是具體行為有差別時。
- 需要安全的封裝多種同一類型的操作時。
- 出現同一抽象多個子類,而又需要使用if-else 或者 switch-case來選擇時。
實現方式
舉例說明
A旗艦店除了正常日不打折,在節假日會推出滿300減100,全場8折等活動
步驟1:定義抽象策略角色(Strategy):現金收費抽象類
abstract class CashSuper {
public abstract double acceptCash(double money);
}
步驟2:定義具體策略角色(Concrete Strategy):每個節日具體的促銷活動
正常收費類
public class CashNormal extends CashSuper{
@Override
public double acceptCash(double money) {
return money;
}
}
打折收費類
public class CashRebate extends CashSuper{
private double moneyRebate=1;
public CashRebate(double moneyRebate){
this.moneyRebate=moneyRebate; //如八折時,傳入0.8
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
滿減收費類
public class CashReduce extends CashSuper{
private double moneyCondition=0;
private double moneyReduce=0;
public CashReduce(double moneyCondition, double moneyReduce) { //如滿300減100,傳入300,100
this.moneyCondition = moneyCondition;
this.moneyReduce = moneyReduce;
}
@Override
public double acceptCash(double money) {
double result=money;
if (money>moneyCondition){//若大於滿減條件,減去滿減值
result=money-Math.floor(money/moneyCondition)*moneyReduce;
}
return result;
}
}
步驟3:定義環境角色(Context):用於連接上下文,即把促銷活動推銷給客戶,這裡可以理解為銷售員
public class CashContext {
private CashSuper cs = null;
public CashContext(String type) {
switch (type) {
case "normal":
CashNormal cashNormal = new CashNormal();
cs = cashNormal;
break;
case "rebate":
CashRebate cashRebate = new CashRebate(0.8);
cs = cashRebate;
break;
case "reduce":
CashReduce cashReduce = new CashReduce(300, 100);
cs = cashReduce;
break;
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}
步驟4:客戶端調用
public class SalesMan {
public static void main(String[] args) {
CashContext mSalesMan;
//平常不打折,消費了1000
mSalesMan = new CashContext("normal");
double normalResult = mSalesMan.getResult(1000);
System.out.println("平常:" + normalResult);
//國慶打8折,消費了1000
mSalesMan = new CashContext("rebate");
double rebateResult = mSalesMan.getResult(1000);
System.out.println("國慶:" + rebateResult);
//元旦滿30減100,消費了1000
mSalesMan = new CashContext("reduce");
double reduceResult = mSalesMan.getResult(1000);
System.out.println("元旦:"+reduceResult);
}
}
輸出結果
平常:1000.0
國慶:800.0
元旦:700.0
優點:
- 結構清晰明瞭、使用簡單直觀。
- 耦合度相對而言較低,擴展方便。
- 操作封裝也更為徹底,數據更為安全。
缺點:
- 隨著策略的增加,子類也會變得繁多。
- java學習群669823128