本篇文章主要介紹的是策略模式基本概念以及應(yīng)用場景。
首先,策略模式是屬于行為型模式的一種,為了更好的理解策略模式,我們首先要理清楚什么是行為型模式。行為型模式(Behavioral Pattern)是對(duì)在不同的對(duì)象之間劃分責(zé)任和算法的抽象化。在對(duì)象的創(chuàng)建(創(chuàng)建型模式)和對(duì)象的結(jié)構(gòu)(結(jié)構(gòu)性模式)問題都解決了之后,就剩下對(duì)象的行為問題了,如果對(duì)象的行為設(shè)計(jì)的較好,那么對(duì)象的行為就會(huì)更清晰,它們之間的協(xié)作效率就會(huì)提高,也更方便開發(fā)人員進(jìn)行維護(hù)和拓展。
通過行為型模式,可以更加清晰地劃分類與對(duì)象的職責(zé),并研究系統(tǒng)在運(yùn)行時(shí)實(shí)例對(duì)象 之間的交互。在系統(tǒng)運(yùn)行時(shí),對(duì)象并不是孤立的,它們可以通過相互通信與協(xié)作完成某些復(fù)雜功能,一個(gè)對(duì)象在運(yùn)行時(shí)也將影響到其他對(duì)象的運(yùn)行。
行為型模式仔細(xì)區(qū)分的話分為類行為型模式和對(duì)象行為型模式兩種:
類行為型模式:類的行為型模式使用繼承關(guān)系在幾個(gè)類之間分配行為,類行為型模式主要通過多態(tài)等方式來分配父類與子類的職責(zé)。
對(duì)象行為型模式:對(duì)象的行為型模式則使用對(duì)象的聚合關(guān)聯(lián)關(guān)系來分配行為,對(duì)象行為型模式主要是通過對(duì)象關(guān)聯(lián)等方式來分配兩個(gè)或多個(gè)類的職責(zé)。根據(jù)“合成復(fù)用原則”,系統(tǒng)中要盡量使用關(guān)聯(lián)關(guān)系來取代繼承關(guān)系,因此大部分行為型設(shè)計(jì)模式都屬于對(duì)象行為型設(shè)計(jì)模式。
在解釋策略模式之前,先沿用改變下設(shè)計(jì)模式之死磕代理模式?這里的故事:
小武跟大多數(shù)人一樣在廣州這座大城市工作,老家在外地,辛苦忙活一整年就期盼寒假那幾天可以回老家陪家人吃團(tuán)年飯放沖天炮感受下家的溫暖。春運(yùn)那幾天是人口大遷徙啊,北上廣深的大批人馬都順勢(shì)回流到內(nèi)陸地區(qū)...火車票什么的相應(yīng)的就是一票難求,使用一些官方購票APP根本搶不到車票好嘛,但小武跟其他很多人一樣需要回家啊。所以他必須需要尋求新的策略,這時(shí)朋友推薦了一個(gè)黃牛給他,黃牛說我也可以幫你買票,但是小武也做好了黃牛買不到票的準(zhǔn)備,他也使用電話訂票、使用各種APP、通過換乘購票等多種方式實(shí)現(xiàn)自己的購票意愿。
完成一項(xiàng)任務(wù),往往可以有多種不同的方式,每一種方式稱為一個(gè)策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的策略來完成該項(xiàng)任務(wù)。關(guān)于策略模式比較好的解釋是:定義一系列算法,將每一個(gè)算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而變化。
根據(jù)這個(gè)故事我們可以有以下結(jié)論:
A:小武回家的購票策略有以下三種策略:黃牛購買、乘車大巴、實(shí)行換乘
B:無論是那種策略都需要進(jìn)行購票
C:由于策略的不同,每一種策略對(duì)應(yīng)的計(jì)算價(jià)格也不盡相同
既然有這樣的結(jié)論,我們首先可以定義一個(gè)購票接口,里面提供具體的價(jià)位:

定義完了購票行為,那么我們就可以定義黃牛策略了,由于黃牛的收費(fèi)規(guī)則是基本票價(jià)加服務(wù)費(fèi),那么我們就可以這樣寫:

如果選擇乘坐大巴這種策略的話,由于時(shí)間較長,除了基本的票價(jià)和服務(wù)費(fèi),還需要購買各種小吃零食辣條等食品來打發(fā)冗余的旅途生涯,因此對(duì)于乘坐大巴這種策略我們可以這樣定義:

小武如果選擇實(shí)現(xiàn)換乘策略(A-B,B-C)那么他可以自己進(jìn)行購票,但是可能會(huì)有其他的費(fèi)用,比如到B位置進(jìn)行留宿等操作,因此針對(duì)這種策略我們可以有以下代碼:

小武在思考好三種策略之后,職業(yè)病告訴他要他用最低的費(fèi)用換取最高的效能,因此他還得設(shè)計(jì)一個(gè)東西去比較三種策略使用的各種條件,通過對(duì)比然后選擇適合自己的購票策略來進(jìn)行實(shí)施。于是,他開始計(jì)算三種策略的費(fèi)用:

嗯,三種策略定義完畢了,總價(jià)的費(fèi)用的計(jì)算模型也簡單完成了,下面就是小武收集到各種票價(jià)信息,服務(wù)費(fèi)用,以及住宿費(fèi)等其他費(fèi)用的結(jié)果:
A:大巴基本票價(jià):500 服務(wù)費(fèi):100 其他費(fèi)用:60
B:黃牛票價(jià):463 服務(wù)費(fèi):150
C:換乘票價(jià):480 其他費(fèi)用:200
根據(jù)這些信息,下面就開始測(cè)試代碼:

通過這個(gè)小例子來理解策略模式,可以發(fā)現(xiàn)這種設(shè)計(jì)模式的優(yōu)點(diǎn)在于:
策略模式提供了對(duì)“開閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為,也可以靈活地增加新的算法或行為;也避免了使用多重條件判斷語句(if else if等等)
那么,在什么場景可以使用策略模式?
比如,在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為;或者在幾種算法中(上面的小例子)選擇其中的一種;如果一個(gè)對(duì)象有很多的行為,如果我不想用 if else if 這種多重的條件選擇語句來判斷,那么策略模式是一種比較好的替代方式;不希望客戶端知道復(fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu),在具體策略類中封裝算法和相關(guān)的數(shù)據(jù)結(jié)構(gòu),提高算法的保密性與安全性。
總結(jié):
策略模式中定義了一系列算法,將每一個(gè)算法封裝起來,并讓它們可以相互替換。
策略模式是對(duì)算法的一種封裝,它把算法的責(zé)任和算法本身分割開,委派給不同的實(shí)例對(duì)象管理。策略模式通常把一個(gè)系列的算法封裝到一系列的策略類里面,作為一個(gè)抽象策略類的子類。
策略模式主要優(yōu)點(diǎn)在不修改原有系統(tǒng)的基礎(chǔ)上可以更換算法或者增加新的算法(側(cè)重算法);它也可以避免多重條件語句,針對(duì)這種多重判斷語句提供了一個(gè)新的解決思路;其缺點(diǎn)在于客戶端必須知道所有的策略類,并理解其區(qū)別進(jìn)行后續(xù)的判別;由于在一定程度上增加了系統(tǒng)中類的個(gè)數(shù),可能會(huì)存在很多策略類。
參考資料:百度百科
如果這篇文章對(duì)您有開發(fā)or學(xué)習(xí)上的些許幫助,希望各位看官留下寶貴的star,謝謝。
Ps:著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明作者, 商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處(開頭或結(jié)尾請(qǐng)?zhí)砑愚D(zhuǎn)載出處,添加原文url地址),文章請(qǐng)勿濫用,也希望大家尊重筆者的勞動(dòng)成果。