2. 設(shè)計(jì)模式之策略模式

image

一、定義

今天我們討論的設(shè)計(jì)模式是「策略模式」,策略模式比較好理解,首先我們看一下他的定義:

策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實(shí)現(xiàn)不同,他可以以相同的方式調(diào)用所有的算法,減少了各種算法類與使用算法類之間的耦合「DEP」。

由上面的定義我們可以看到,策略模式有3個要素:

  • 策略模板:策略模式的算法都是為了完成相同的工作的,只是可能觸發(fā)條件不同,所以我們就可以抽象出來一個策略模板,類似于「工廠模式中的產(chǎn)品模板」;
  • 策略:根據(jù)具體場景實(shí)現(xiàn)不同的策略,以根據(jù)實(shí)際場景得到具體的結(jié)果;
  • 上下文:上下文根據(jù)場景不同來決定使用哪種策略。

二、舉例說明

策略模式在生活中也比較常見,下面舉例說明:

當(dāng)我們在生活中乘坐公交地鐵的時候,合肥市的票價是2元、學(xué)生半價、老年人免票,這就是一種常見的設(shè)計(jì)模式,我們可以看出:

  • 都是為了解決人們乘車計(jì)價的問題
  • 不同年齡段的人計(jì)算價格方法不同

那我們就有實(shí)現(xiàn)方案:

//策略模板
class StrategyTemplate {
    constructor() {}
}

// 老年人免票
class OldPersonStrategy extends StrategyTemplate {
    constructor() {}

    calculatePrice() {
        return 0;
    }
}

// 學(xué)生半價
class StudentStrategy extends StrategyTemplate {
    constructor() {}

    calculatePrice() {
        return 1;
    }
}

// 普票2元
class NormalStrategy extends StrategyTemplate {
    constructor() {}

    calculatePrice() {
        return 2;
    }
}

// 上下文傳入策略并使用
class BusContext {
    constructor(strategy) {
        this.strategy = strategy;
    }

    pay() {
        return this.strategy.calculatePrice();
    }
}

// 使用
const oldPerson = new BusContext(new OldPersonStrategy());
oldPerson.pay();
const student = new BusContext(new StudentStrategy());
student.pay();
const person = new BusContext(new NormalStrategy());
person.pay();

生活中我們隨處可見也有很多策略模式的使用,比如洗衣機(jī)(快洗、漂洗、大件等)、電飯煲(煮飯、煮粥等)、電動牙刷(高頻、中頻、低頻)、購物(滿減、打折、返利等)。

總結(jié)

由上面這么多的例子我們可以總結(jié)出來,策略模式的使用場景有幾個特點(diǎn):

  • 面對一個問題/需求有多種解決策略,需要判斷不同的場景
  • 場景的數(shù)量較少

優(yōu)點(diǎn)就是:

  • 策略與策略之間相互獨(dú)立,擴(kuò)展性、維護(hù)性比較好
  • 單元測試好做
  • 減少了switch/if else判斷

缺點(diǎn)就是:

  • 不適合解決場景太多的情況

參考
個人博客

北落師門的博客

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

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

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