策略模式

定義:定義一組算法犬金,將每個(gè)算法都封裝起來丘逸,并且使他們之間可以互換蝉娜。
類型:行為類模式

策略模式是對算法的封裝,把一系列的算法分別封裝到對應(yīng)的類中复斥,并且這些類實(shí)現(xiàn)相同的接口,相互之間可以替換械媒。在前面說過的行為類模式中目锭,有一種模式也是關(guān)注對算法的封裝——模版方法模式,對照類圖可以看到纷捞,策略模式與模版方法模式的區(qū)別僅僅是多了一個(gè)單獨(dú)的封裝類Context痢虹,它與模版方法模式的區(qū)別在于:在模版方法模式中,調(diào)用算法的主體在抽象的父類中主儡,而在策略模式中奖唯,調(diào)用算法的主體則是封裝到了封裝類Context中,抽象策略Strategy一般是一個(gè)接口糜值,目的只是為了定義規(guī)范丰捷,里面一般不包含邏輯。其實(shí)寂汇,這只是通用實(shí)現(xiàn)病往,而在實(shí)際編程中,因?yàn)楦鱾€(gè)具體策略實(shí)現(xiàn)類之間難免存在一些相同的邏輯骄瓣,為了避免重復(fù)的代碼停巷,我們常常使用抽象類來擔(dān)任Strategy的角色,在里面封裝公共的代碼榕栏,因此畔勤,在很多應(yīng)用的場景中,在策略模式中一般會(huì)看到模版方法模式的影子臼膏。

策略模式的結(jié)構(gòu)

  • 封裝類:也叫上下文硼被,對策略進(jìn)行二次封裝,目的是避免高層模塊對策略的直接調(diào)用渗磅。

  • 抽象策略:通常情況下為一個(gè)接口嚷硫,當(dāng)各個(gè)實(shí)現(xiàn)類中存在著重復(fù)的邏輯時(shí)检访,則使用抽象類來封裝這部分公共的代碼,此時(shí)仔掸,策略模式看上去更像是模版方法模式脆贵。

  • 具體策略:具體策略角色通常由一組封裝了算法的類來擔(dān)任,這些類之間可以根據(jù)需要自由替換起暮。

      interface IStrategy {  
          public void doSomething();  
      }  
      class ConcreteStrategy1 implements IStrategy {  
          public void doSomething() {  
              System.out.println("具體策略1");  
          }  
      }  
      class ConcreteStrategy2 implements IStrategy {  
          public void doSomething() {  
              System.out.println("具體策略2");  
          }  
      }  
      class Context {  
          private IStrategy strategy;  
            
          public Context(IStrategy strategy){  
              this.strategy = strategy;  
          }  
            
          public void execute(){  
              strategy.doSomething();  
          }  
      }  
        
      public class Client {  
          public static void main(String[] args){  
              Context context;  
              System.out.println("-----執(zhí)行策略1-----");  
              context = new Context(new ConcreteStrategy1());  
              context.execute();  
        
              System.out.println("-----執(zhí)行策略2-----");  
              context = new Context(new ConcreteStrategy2());  
              context.execute();  
          }  
      }  
    

策略模式的優(yōu)缺點(diǎn)

策略模式的主要優(yōu)點(diǎn)有:

  • 策略類之間可以自由切換卖氨,由于策略類實(shí)現(xiàn)自同一個(gè)抽象,所以他們之間可以自由切換负懦。
  • 易于擴(kuò)展筒捺,增加一個(gè)新的策略對策略模式來說非常容易,基本上可以在不改變原有代碼的基礎(chǔ)上進(jìn)行擴(kuò)展纸厉。
  • 避免使用多重條件系吭,如果不使用策略模式,對于所有的算法颗品,必須使用條件語句進(jìn)行連接肯尺,通過條件判斷來決定使用哪一種算法,在上一篇文章中我們已經(jīng)提到躯枢,使用多重條件判斷是非常不容易維護(hù)的则吟。

策略模式的缺點(diǎn)主要有兩個(gè):

  • 維護(hù)各個(gè)策略類會(huì)給開發(fā)帶來額外開銷,可能大家在這方面都有經(jīng)驗(yàn):一般來說锄蹂,策略類的數(shù)量超過5個(gè)氓仲,就比較令人頭疼了。
  • 必須對客戶端(調(diào)用者)暴露所有的策略類得糜,因?yàn)槭褂媚姆N策略是由客戶端來決定的寨昙,因此,客戶端應(yīng)該知道有什么策略掀亩,并且了解各種策略之間的區(qū)別舔哪,否則,后果很嚴(yán)重槽棍。例如捉蚤,有一個(gè)排序算法的策略模式,提供了快速排序炼七、冒泡排序缆巧、選擇排序這三種算法,客戶端在使用這些算法之前豌拙,是不是先要明白這三種算法的適用情況陕悬?再比如,客戶端要使用一個(gè)容器按傅,有鏈表實(shí)現(xiàn)的捉超,也有數(shù)組實(shí)現(xiàn)的胧卤,客戶端是不是也要明白鏈表和數(shù)組有什么區(qū)別?就這一點(diǎn)來說是有悖于迪米特法則的拼岳。

適用場景

幾個(gè)類的主要邏輯相同枝誊,只在部分邏輯的算法和行為上稍有區(qū)別的情況。
有幾種相似的行為惜纸,或者說算法叶撒,客戶端需要?jiǎng)討B(tài)地決定使用哪一種,那么可以使用策略模式耐版,將這些算法封裝起來供客戶端調(diào)用祠够。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市粪牲,隨后出現(xiàn)的幾起案子哪审,更是在濱河造成了極大的恐慌,老刑警劉巖虑瀑,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滴须,居然都是意外死亡舌狗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門扔水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痛侍,“玉大人,你說我怎么就攤上這事魔市≈鹘欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵待德,是天一觀的道長君丁。 經(jīng)常有香客問我,道長将宪,這世上最難降的妖魔是什么绘闷? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮较坛,結(jié)果婚禮上印蔗,老公的妹妹穿的比我還像新娘。我一直安慰自己丑勤,他們只是感情好华嘹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著法竞,像睡著了一般耙厚。 火紅的嫁衣襯著肌膚如雪强挫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天颜曾,我揣著相機(jī)與錄音纠拔,去河邊找鬼。 笑死泛豪,一個(gè)胖子當(dāng)著我的面吹牛稠诲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诡曙,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臀叙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了价卤?” 一聲冷哼從身側(cè)響起劝萤,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慎璧,沒想到半個(gè)月后床嫌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胸私,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年厌处,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岁疼。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阔涉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捷绒,到底是詐尸還是另有隱情瑰排,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布暖侨,位于F島的核電站椭住,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏字逗。R本人自食惡果不足惜函荣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扳肛。 院中可真熱鬧傻挂,春花似錦、人聲如沸挖息。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绪抛,卻和暖如春资铡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幢码。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工笤休, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人症副。 一個(gè)月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓店雅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贞铣。 傳聞我的和親對象是個(gè)殘疾皇子闹啦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

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

  • 1 場景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià),對于銷售部門的人來講辕坝,這是一個(gè)非常重大窍奋、非常復(fù)雜的問題,對不同的...
    七寸知架構(gòu)閱讀 5,080評論 9 62
  • 1 場景問題 1.1 報(bào)價(jià)管理 向客戶報(bào)價(jià)酱畅,對于銷售部門的人來講琳袄,這是一個(gè)非常重大、非常復(fù)雜的問題纺酸,對不同的客戶要...
    4e70992f13e7閱讀 3,087評論 2 16
  • 1.概述 demo地址吁峻,歡迎star 例子1: 商場產(chǎn)品銷售:可以正常價(jià)格售出,可以打折形式售出在张,也可以通過積分的...
    barry閱讀 753評論 0 1
  • 策略模式——《設(shè)計(jì)模式之禪》 很好理解的例子 劉備江東娶親用含,三個(gè)錦囊妙計(jì) 一個(gè)接口,三個(gè)實(shí)現(xiàn)類帮匾,三個(gè)錦囊妙計(jì) 封裝...
    書筆年華閱讀 231評論 0 0
  • 本文僅僅為入門啄骇,高手勿噴。 實(shí)際工作中瘟斜,我們總會(huì)遇到類似如下的需求:某支付系統(tǒng)接入以下幾種商戶進(jìn)行充值:易寶網(wǎng)易缸夹,...
    JarvanMo閱讀 14,238評論 14 26