策略模式

第三章 策略模式

  • 在策略模式(Strategy Pattern)中昼蛀,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改丐枉。這種類型的設(shè)計(jì)模式屬于行為型模式
  • 在策略模式中披摄,我們創(chuàng)建表示各種策略的對象和一個(gè)行為隨著策略對象改變而改變的 context 對象淳玩。策略對象改變 context 對象的執(zhí)行算法牙勘。

3.1 介紹

  • 意圖:定義一系列的算法,把它們一個(gè)個(gè)封裝起來, 并且使它們可相互替換
  • 主要解決:在有多種算法相似的情況下莫绣,使用 if...else 所帶來的復(fù)雜和難以維護(hù)
  • 何時(shí)使用:一個(gè)系統(tǒng)有許多許多類未斑,而區(qū)分它們的只是他們直接的行為
  • 如何解決:將這些算法封裝成一個(gè)一個(gè)的類伞辛,任意地替換
  • 關(guān)鍵代碼:實(shí)現(xiàn)同一個(gè)接口
  • 應(yīng)用實(shí)例:
    • 諸葛亮的錦囊妙計(jì)西疤,每一個(gè)錦囊就是一個(gè)策略
    • 旅行的出游方式烦粒,選擇騎自行車、坐汽車代赁,每一種旅行方式都是一個(gè)策略扰她。
  • 優(yōu)點(diǎn):
    • 算法可以自由切換
    • 避免使用多重條件判斷
    • 擴(kuò)展性良好
  • 缺點(diǎn):
    • 策略類會增多
    • 所有策略類都需要對外暴露
  • 使用場景:
    • 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為管跺,那么使用策略模式可以動態(tài)地讓一個(gè)對象在許多行為中選擇一種行為
    • 一個(gè)系統(tǒng)需要動態(tài)地在幾種算法中選擇一種
    • 如果一個(gè)對象有很多的行為义黎,如果不用恰當(dāng)?shù)哪J剑@些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)
  • 注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè)豁跑,就需要考慮使用混合模式廉涕,解決策略類膨脹的問題

3.2 UML

一個(gè)定義活動的 Strategy接口和實(shí)現(xiàn)了 Strategy 接口的實(shí)體策略類。Context 是一個(gè)使用了某種策略的類

策略模式.png

3.3 代碼

  1. 創(chuàng)建一個(gè)接口

    public interface Strategy {
      /*定義算法抽象方法*/
      int doOperation(int num1,int num2);
    }
    
  2. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類

    //加法
    public class OperationAdd implements Strategy {
    
      public int doOperation(int num1, int num2) {
        return num1 + num2;
      }
    }
    //減法
    public class OperationSub implements Strategy {
      public int doOperation(int num1, int num2) {
        return num1 - num2;
      }
    }
    //乘法
    public class OperationMult implements Strategy {
      public int doOperation(int num1, int num2) {
        return num1 * num2;
      }
    }
    
  3. 創(chuàng)建Context類

    public class Context {
    
      private Strategy strategy;
    
      public Context(Strategy strategy) {
        this.strategy = strategy;
      }
    
      public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
      }
    
      public void executeStrategy(int num1, int num2){
        int result =  strategy.doOperation(num1,num2);
        System.out.println(result);
      }
    }
    
  4. 結(jié)果

    ------加法--------
    8
    -------減法-------
    2
    -------乘法-------
    15
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艇拍,一起剝皮案震驚了整個(gè)濱河市狐蜕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸夕,老刑警劉巖层释,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異快集,居然都是意外死亡贡羔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門个初,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乖寒,“玉大人,你說我怎么就攤上這事院溺¢灌遥” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵珍逸,是天一觀的道長逐虚。 經(jīng)常有香客問我,道長谆膳,這世上最難降的妖魔是什么叭爱? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮漱病,結(jié)果婚禮上涤伐,老公的妹妹穿的比我還像新娘馒胆。我一直安慰自己,他們只是感情好凝果,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布祝迂。 她就那樣靜靜地躺著,像睡著了一般器净。 火紅的嫁衣襯著肌膚如雪型雳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天山害,我揣著相機(jī)與錄音纠俭,去河邊找鬼。 笑死浪慌,一個(gè)胖子當(dāng)著我的面吹牛冤荆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播权纤,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼钓简,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汹想?” 一聲冷哼從身側(cè)響起外邓,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎古掏,沒想到半個(gè)月后损话,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡槽唾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年丧枪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庞萍。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拧烦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挂绰,到底是詐尸還是另有隱情屎篱,我是刑警寧澤服赎,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布葵蒂,位于F島的核電站,受9級特大地震影響重虑,放射性物質(zhì)發(fā)生泄漏践付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一缺厉、第九天 我趴在偏房一處隱蔽的房頂上張望永高。 院中可真熱鬧隧土,春花似錦、人聲如沸命爬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饲宛。三九已至皆愉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艇抠,已是汗流浹背幕庐。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留家淤,地道東北人异剥。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像絮重,于是被迫代替她去往敵國和親冤寿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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

  • 在策略模式(Strategy Pattern)中绿鸣,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改疚沐。這種類型的設(shè)計(jì)模式屬于行為...
    陳吉思_汗閱讀 123評論 0 0
  • 參考資料:漫話:如何給女朋友解釋什么是策略模式? 設(shè)計(jì)模式之策略模式(實(shí)例+Demo) Java設(shè)計(jì)模式(8)——...
    幫我的鴕鳥蓋個(gè)章閱讀 386評論 0 1
  • 一.定義:策略模式定義了算法族潮模,分別封裝起來亮蛔,讓他們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶擎厢。 注...
    most_xiaoya閱讀 212評論 0 0
  • 黑色的海島上懸著一輪又大又圓的明月动遭,毫不嫌棄地把溫柔的月色照在這寸草不生的小島上芬探。一個(gè)少年白衣白發(fā),悠閑自如地倚坐...
    小水Vivian閱讀 3,102評論 1 5
  • 漸變的面目拼圖要我怎么拼酝静? 我是疲乏了還是投降了? 不是不允許自己墜落羡玛, 我沒有滴水不進(jìn)的保護(hù)膜别智。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,240評論 0 13