行為型模式之策略模式解析壮韭,策略模式的使用場景和優(yōu)缺點總結(jié)

策略模式

  • 策略模式: 定義一組算法,將每一個算法封裝到具有共同接口的獨立類中,從而使得各個算法之間可以相互替換
    • 策略模式屬于行為型模式,可以使得算法在不影響客戶端的情況下自由切換
    • 策略模式是對算法的包裝,將使用算法和算法本身分離開來,委托給不同的對象進行管理
    • 策略模式通常將一個系列的算法包裝到一系列的策略類中,作為一個抽象策略類的子類
  • 策略模式應用場景:
    • 當實現(xiàn)某一個功能存在多個算法或者策略時,可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來實現(xiàn)某個功能
      • 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種時,可以將每個算法封裝到策略類中
      • 一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn),可以將每個條件分支移入各自策略類中來代替這些條件語句
      • 系統(tǒng)中各個算法策略彼此獨立,并且要求對客戶端隱藏具體算法的實現(xiàn)細節(jié)
      • 系統(tǒng)要求使用算法的客戶不應知道操作的數(shù)據(jù),可以使用策略模式隱藏與算法有關的數(shù)據(jù)結(jié)構(gòu)
      • 多個類的區(qū)別只是表現(xiàn)行為的不同,可以使用策略模式在系統(tǒng)運行時選擇需要具體執(zhí)行的行為
    • 比如數(shù)據(jù)排序策略的冒泡排序,選擇排序,插入排序和二叉樹排序等


      在這里插入圖片描述
  • 策略模式包含三個角色:
    • 環(huán)境Context: 持有一個抽象策略Strategy的引用
    • 抽象策略Strategy: 抽象角色.給出所有具體策略類所需的接口,通常是由一個接口或者抽象類實現(xiàn)
    • 具體策略ConcreteStrategy: 具體策略類. 封裝了具體的算法
  • 策略模式Strategy示例

策略模式總結(jié)

  • 策略模式的重點:
    • 如何實現(xiàn)算法
    • 而是在于如何組織,調(diào)用一系列的算法,從而讓程序的結(jié)構(gòu)更加靈活,具有良好的可維護性以及擴展性
  • 算法的平等性:
    • 策略模式的一個特點在于各個算法策略的平等性
    • 對于一系列算法之間是平等的,只有這樣的算法之間才可以相互替換
    • 策略模式中具體策略算法在實現(xiàn)上是相互獨立的,相互之間沒有依賴
  • 運行策略的唯一性:
    • 在程序運行期間,策略在某一個時間點只能使用一個具體的策略實現(xiàn)對象
    • 策略模式可以動態(tài)地在不同的具體算法策略之間進行切換,但在同一個時間點只能使用一個具體算法策略
  • 策略模式中公有的行為:
    • 通常情況下,策略模式的各個具體策略之間會有一些公有的行為
    • 此時,應該將這些各個具體策略之間公有的行為放到共同的抽象策略Strategy類中
    • 此時,抽象策略Strategy類可以使用抽象類Abstract實現(xiàn),而非必須使用接口

策略模式優(yōu)點

  • 策略模式提供了管理一系列算法的方法. 策略類Strategy的等級結(jié)構(gòu)定義了一個算法或者是行為族,可以通過繼承將公有的代碼放到父類Strategy中,從而避免代碼重復
  • 策略模式避免了使用多重條件if-else語句,提高了項目的可維護性
  • 策略模式提供相同行為的不同實現(xiàn),客戶端可以根據(jù)不同的時間和空間要求選擇不同的實現(xiàn)策略
  • 策略模式完美支持開閉原則,可以在不修改原代碼的情況下,靈活增加新的算法策略
  • 策略模式將算法的使用放到環(huán)境類中,算法的實現(xiàn)放到具體策略類中,實現(xiàn)了算法的使用和算法的實現(xiàn)的二者分離

策略模式缺點

  • 策略模式只適用于客戶端知道具體算法策略或者行為的情況. 客戶端必須知道所有的策略類,并自行決定使用具體的策略類,也就是說客戶端必須理解這些算法的區(qū)別來決定選擇使用什么樣的算法
  • 策略模式會將每一個具體算法策略單獨封裝成一個類,如果存在大量具體算法策略時,會造成系統(tǒng)中存在大量的對象

策略工廠模式

  • 在使用策略模式的系統(tǒng)中,當一個系統(tǒng)的存在大量的策略時,客戶端管理的策略算法將很復雜,可以通過在環(huán)境類中使用策略工廠模式來管理這些策略類


    在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祸憋,一起剝皮案震驚了整個濱河市佛掖,隨后出現(xiàn)的幾起案子习劫,更是在濱河造成了極大的恐慌叙谨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓤鼻,死亡現(xiàn)場離奇詭異秉版,居然都是意外死亡,警方通過查閱死者的電腦和手機茬祷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門清焕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祭犯,你說我怎么就攤上這事秸妥。” “怎么了沃粗?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵粥惧,是天一觀的道長。 經(jīng)常有香客問我最盅,道長突雪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任涡贱,我火速辦了婚禮咏删,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘问词。我一直安慰自己督函,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布激挪。 她就那樣靜靜地躺著辰狡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灌灾。 梳的紋絲不亂的頭發(fā)上搓译,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天悲柱,我揣著相機與錄音锋喜,去河邊找鬼。 笑死,一個胖子當著我的面吹牛嘿般,可吹牛的內(nèi)容都是我干的段标。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炉奴,長吁一口氣:“原來是場噩夢啊……” “哼逼庞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞻赶,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赛糟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砸逊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧南,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年师逸,在試婚紗的時候發(fā)現(xiàn)自己被綠了司倚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡篓像,死狀恐怖动知,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情员辩,我是刑警寧澤盒粮,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站奠滑,受9級特大地震影響拆讯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜养叛,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一种呐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弃甥,春花似錦爽室、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓶珊,卻和暖如春啸箫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伞芹。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工忘苛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝉娜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓扎唾,卻偏偏與公主長得像召川,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胸遇,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容