策略模式

定義

策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式

從定義中來(lái)看,策略模式的目標(biāo)是優(yōu)化類的行為選擇,將選擇行為和行為本身實(shí)現(xiàn)細(xì)節(jié)拆分,達(dá)到選擇行為只控制流程,比如你要從A地到達(dá)B地,現(xiàn)在你有三種交通方式,汽車,自行車,火車。三種方式的耗時(shí),路線選擇都不一樣。如果采取策略模式來(lái)描述這個(gè)場(chǎng)景,則選擇何種交通方式就是在控制流程,而具體的流程細(xì)節(jié)是由單獨(dú)的行為本身實(shí)現(xiàn)。

實(shí)例

public interface IntOpt {
    public int doOpt(int num, int num2);
}
public class Add implements IntOpt {
    @Override
    public int doOpt(int num, int num2) {
        return num + num2;
    }
}
public class Multiply implements IntOpt {
    @Override
    public int doOpt(int num, int num2) {
        return num * num2;
    }
}
public class IntOptContext {
    private IntOpt mIntOpt;

    public IntOptContext(IntOpt intOpt){
        this.mIntOpt = intOpt;
    }
    
    public int doOpt(int num, int nums){
        if (mIntOpt != null) {
            return mIntOpt.doOpt(num, nums);
        }
        return 0;
    }
}

上述接口描述了四則運(yùn)算中的加法和乘法,IntOptContext屬于策略的包裝類,加上該類可以給當(dāng)前框架充當(dāng)中間層,以至于有改動(dòng)的時(shí)候不用去修改客戶端代碼和策略實(shí)現(xiàn),如果不用該包裝,直接使用選擇的策略類來(lái)操作也是可以的。如果是單個(gè)算法實(shí)現(xiàn),也可以采用策略枚舉

public enum  IntOptEnum {
    ADD("+"){
        @Override
        public int doOpt(int num, int nums) {
            return num + nums;
        }
    },

    SUB("-"){

        @Override
        public int doOpt(int num, int nums) {
            return num - nums;
        }
    };


    String symbol;

    private IntOptEnum(String symbol){
        this.symbol = symbol;
    }

    public String getSymbol(){
        return symbol;
    }

    public abstract int doOpt(int num, int nums);
}

總結(jié)

優(yōu)點(diǎn): 1、算法可以自由切換。 2、避免使用多重條件判斷。 3、擴(kuò)展性良好。

缺點(diǎn): 1、策略類會(huì)增多。 2、所有策略類都需要對(duì)外暴露。

使用場(chǎng)景: 1、如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。 2、一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。 3、如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。

注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式,解決策略類膨脹的問(wèn)題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 二十三種設(shè)計(jì)模式 - 策略模式 策略模式簡(jiǎn)介 模式動(dòng)機(jī) 完成一項(xiàng)任務(wù),往往可以有多種不同的方式,每一種方式稱為一個(gè)...
    JustTheSame閱讀 1,903評(píng)論 2 16
  • 【學(xué)習(xí)難度:★☆☆☆☆,使用頻率:★★★★☆】直接出處:策略模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 1,633評(píng)論 3 5
  • 1.初識(shí)策略模式 定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶...
    王偵閱讀 1,545評(píng)論 0 3
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是策略模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 策略模式和模板方法模式的區(qū)別 優(yōu)點(diǎn)和...
    w1992wishes閱讀 958評(píng)論 1 7
  • 設(shè)計(jì)模式 1 什么是策略模式 在策略模式中,定義了一些獨(dú)立的類來(lái)封裝不同的算法,每一個(gè)類封裝一種具體的算法,在這里...
    凱玲之戀閱讀 1,352評(píng)論 0 3

友情鏈接更多精彩內(nèi)容