設計模式之策略模式(筆記)

策略模式:它定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶。
策略模式封裝了變化,減少了各種算法類與使用算法類之間的耦合。
例如做一個商場收銀軟件,定義三種收費方式,正常收費,打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);
     }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章