策略模式:它定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。
策略模式封裝了變化,減少了各種算法類與使用算法類之間的耦合。
例如做一個商場收銀軟件,定義三種收費方式,正常收費,打8折,滿300送100.這三種收費方式實際上就是具體的三種策略方式。
首先定義一個抽象算法類CashSuper,定義支持所有算法的公共接口
public abstract class CashSuper {
//應付金額抽象方法
public abstract double acceptCash(double money);
}
接着定義三種具體的策略類,來繼承CashSuper
正常收費類 CashNormal
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
打折收費類CashRebate
public class CashRebate extends CashSuper {
private double moneyRebate=1;
//折扣
public CashRebate(String rebate){
this.moneyRebate=Double.valueOf(moneyRebate);
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
返回收費類CashReturn
public class CashReturn extends CashSuper{
private double moneyCondition=0;
private double moneyReturn=0;
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>=moneyCondition){
result=money-Math.floor(money/moneyCondition)*moneyReturn;
}
return result;
}
}
定義一個CashContext類來配置,用來維護一個對CashSuper抽象類的應用
public class CashContext {
private CashSuper cashSuper;
//帶type的構造函數,將實例化具體策略的過程由客戶端轉移到cashcontext類中,結合了簡單工廠的應用
public CashContext(String type){
switch (type) {
case "正常收費":
CashNormal cNormal=new CashNormal();
cashSuper=cNormal;
break;
case "打8折":
CashRebate cRebate=new CashRebate("0.8");
cashSuper=cRebate;
break;
case "滿300送100":
CashReturn cReturn=new CashReturn("300","100");
cashSuper=cReturn;
break;
}
}
//返回應付金額
public double getResult(double money){
return cashSuper.acceptCash(money);
}
}