設(shè)計(jì)模式之死磕策略模式(原創(chuàng))

本篇文章主要介紹的是策略模式基本概念以及應(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)用:

計(jì)算總價(jià)

嗯,三種策略定義完畢了,總價(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è)試代碼:

策略模式測(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)成果。

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 在解釋代理模式(靜態(tài)代理和動(dòng)態(tài)代理)之前,先講一段故事: 小武跟大多數(shù)人一樣在廣州這座大城市工作,老家在外地,辛苦...
    騎小豬看流星閱讀 2,402評(píng)論 6 24
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,081評(píng)論 1 15
  • 1 場景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià),對(duì)于銷售部門的人來講,這是一個(gè)非常重大、非常復(fù)雜的問題,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,249評(píng)論 9 62
  • 關(guān)于童年的記憶,仿佛都是關(guān)于打谷場的,也不知道哪里才是開始。 小時(shí)候的村里,總是有很多的人,有很多的...
    繁葉日光閱讀 1,345評(píng)論 2 5
  • 韓國 今年開始,公司已經(jīng)慢慢分開始分配個(gè)人資源,吳世勛也開始了自己的活動(dòng),明年三月的一個(gè)偵探節(jié)目《犯人就是...
    我是毛毛蟲菠蘿閱讀 672評(píng)論 1 1

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