策略模式

第三章 策略模式

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

3.1 介紹

  • 意圖:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái), 并且使它們可相互替換
  • 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來(lái)的復(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):
    • 策略類會(huì)增多
    • 所有策略類都需要對(duì)外暴露
  • 使用場(chǎng)景:
    • 如果在一個(gè)系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為
    • 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種
    • 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)
  • 注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式,解決策略類膨脹的問(wèn)題

3.2 UML

一個(gè)定義活動(dòng)的 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)容合作請(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 在策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為...
    陳吉思_汗閱讀 138評(píng)論 0 0
  • 參考資料:漫話:如何給女朋友解釋什么是策略模式? 設(shè)計(jì)模式之策略模式(實(shí)例+Demo) Java設(shè)計(jì)模式(8)——...
    幫我的鴕鳥蓋個(gè)章閱讀 438評(píng)論 0 1
  • 一.定義:策略模式定義了算法族,分別封裝起來(lái),讓他們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶。 注...
    most_xiaoya閱讀 273評(píng)論 0 0
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了? 不是不允許自己墜落, 我沒(méi)有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,502評(píng)論 0 13
  • 感覺(jué)自己有點(diǎn)神經(jīng)衰弱,總是覺(jué)得手機(jī)響了;屋外有人走過(guò);每次媽媽不聲不響的進(jìn)房間突然跟我說(shuō)話,我都會(huì)被嚇得半死!一整...
    章魚的擁抱閱讀 2,412評(píng)論 4 5

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