設計模式--策略模式

什麼是策略模式

在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。
在策略模式中,咱們建立表示各類策略的對象和一個行爲隨着策略對象改變而改變的 context 對象。策略對象改變 context 對象的執行算法。
其思想是針對一組算法,將每一種算法都封裝到具備共同接口的獨立的類中,從而是它們能夠相互替換。策略模式的最大特色是使得算法能夠在不影響客戶端的狀況下發生變化,從而改變不一樣的功能。算法

簡單解釋

參照大話設計模、菜鳥教程。一、商場收費爲例,不管原價收取、打折收取仍是滿300減50,這些都是一個一個的策略。二、外出旅行,不管選擇坐巴士、騎自行車或選擇飛機出生,這都是一個一個的策略。這些策略都是隨時可能互相替換,且互相以前並不影響。設計模式

  • 優勢
    一、算法能夠自由切換。 二、避免使用多重條件判斷。 三、擴展性良好。
  • 缺點
    一、策略類會增多。 二、全部策略類都須要對外暴露。

代碼解釋

參照大話設計模式中的商場促銷,商場促銷分別是打折、滿減或者原價收費,咱們能夠把計算收費作爲抽象方法提取出來;
一、定義抽象類,將計算費用方法抽象;bash

/**
 * 抽象算法類,定義算法
 */
public abstract class Strategy {

    /**
     * 算法方法
     */
    public abstract Double getMoney(Double money);
}
複製代碼

二、分別定義子類,正常收費、打折收費、滿減收費三個子類,繼承抽象類,實現具體方法ide

/**
 * 正常收費
 */
public class StrategyNormal extends Strategy {

    @Override
    public Double getMoney(Double money) {
        System.out.println("正常收費");
        return money;
    }
}
複製代碼
/**
 * 打折收費
 */
public class StrategyRebate extends Strategy {

    private Double rebate;

    /**
     * 實例化時,傳入具體打折參數,例:打八折,則傳入0.8
     * @param rebate
     */
    public StrategyRebate(Double rebate){
        this.rebate=rebate;
    }

    @Override
    public Double getMoney(Double money) {
        return money*rebate;
    }
}
複製代碼
/**
 * 滿減收費 滿300減100
 */
public class StrategyReturn extends Strategy {

    private Double moneyCondition;
    private Double moneyReturn;

    /**
     * 傳知足條件後,減多少費用
     * @param moneyCondition 條件
     * @param moneyReturn 減免條件
     */
    public StrategyReturn(Double moneyCondition,Double moneyReturn){
        this.moneyCondition=moneyCondition;
        this.moneyReturn=moneyReturn;
    }

    @Override
    public Double getMoney(Double money) {
        if(money>=this.moneyCondition){
            return money-this.moneyReturn;
        }
        return money;
    }
}
複製代碼

三、定義一個配置類,維護針對於算法的引用ui

/**
 * 針對於算法的引用,根據具體的策略對象調用其算法方法
 */
public class StrateContext {

    private Strategy strategy;

    public StrateContext(Strategy strategy){
        this.strategy=strategy;
    }

    public Double getMoney(Double money){
        return strategy.getMoney(money);
    }
    /**
     * 示例
     * @param args
     */
    public static void main(String[] args) {
        //正常收費
        StrateContext context=new StrateContext(new StrategyNormal());
        Double d1=context.getMoney(100.0d);
        System.out.println("正常收費:"+d1);

        //滿300減100
        StrateContext context1=new StrateContext(new StrategyReturn(300d,100d));
        Double d2=context1.getMoney(350d);
        System.out.println("滿300減100:"+d2);

        //打八折
        StrateContext context2=new StrateContext(new StrategyRebate(0.8d));
        Double d3=context2.getMoney(100d);
        System.out.println("打八折:"+d3);
    }
}
複製代碼

後記

以上代碼僅僅實現了策略模式的簡單使用,一般業務代碼中可能還要更復雜,可是萬變不離其中,經過將策略模式與工廠模式接合,將能夠實現代碼應用的鬆藕合;this

相關文章
相關標籤/搜索