策略模式(Strategy Pattern)

一郎嫁、策略模式

在策略(Strategy Pattern)中,一個類的行為或算法可以在運(yùn)行時動態(tài)的更改。這種類型的設(shè)計(jì)模式屬于行為模式(Behavioral Pattern-對象間通信)蝠咆。
在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的context對象谈况。策略對象改變context對象的執(zhí)行算法。

二递胧、介紹

意圖: 定義一系列算法碑韵,把它們一個個封裝起來,并且是她們可互相替換缎脾。

Define a family of algorithms, encapsulate each one, and make them interchangeable

主要解決: 在有多種算法相似的情況下祝闻,使用if...else 所帶來的復(fù)雜和難以維護(hù)。
何時使用: 一個系統(tǒng)中有許多許多類遗菠,而區(qū)分它們的只是它們直接的行為联喘。
如何解決: 將這些算法封裝成一個一個類,任意替換辙纬。
關(guān)鍵代碼: 實(shí)現(xiàn)同一個接口豁遭。
應(yīng)用實(shí)例:

  1. 諸葛亮的錦囊妙計(jì),每個錦囊就是一個策略贺拣。
  2. 旅行的出游方式蓖谢,選擇,??譬涡,闪幽,,涡匀,每一種旅行方式都是一個策略盯腌。
  3. Java AWT 中的LayoutManager。(這個不熟悉)

優(yōu)點(diǎn):

  1. 算法可以自由的切換陨瘩。
  2. 避免使用多重條件判斷腕够。
  3. 擴(kuò)展性良好级乍。

缺點(diǎn):

  1. 策略類會增多。
  2. 所有的策略類都需要對外暴露燕少。
    使用場景:
  3. 如果在一個系統(tǒng)中有許多類卡者,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為客们。
  4. 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種崇决。
  5. 如果一個對象有許多行為,如果不用恰當(dāng)?shù)哪J降状欤@些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)恒傻。

注意事項(xiàng): 如果一個系統(tǒng)中的策略多于4個,就是需要考慮使用混合模式建邓,解決策略模式膨脹的問題盈厘。

三、實(shí)現(xiàn)

類結(jié)構(gòu)圖如下:


策略模式類圖.png
  • Context角色:起承上啟下封裝作用官边,屏蔽高層模塊對策略沸手、算法的直接訪問,封裝可能存在的變化注簿。
  • Strategy抽象策略角色:策略契吉、算法家族的抽象,通常為接口诡渴,定義每個策略或算法必須具有的方法和屬性捐晶。
  • ConcreteStrategy具體策略角色:實(shí)現(xiàn)抽象策略中的操作,該類含有具體的算法妄辩。
  1. 創(chuàng)建策略接口(Strategy):
public interface Strategy {
  int doOperation(int operator1, int operator2);
}
  1. 創(chuàng)建策略具體算法實(shí)現(xiàn)類(OperationAdd惑灵、OperationMultiply、OperationSubstract):
public class OperationAdd implements Strategy {
    @Override
    public int doOperation(int operator1, int operator2) {
        return operator1 + operator2;
    }
}
  1. 創(chuàng)建Context類:
public class Context {
  private Strategy strategy;

  public Context(Strategy strategy) {
      this.strategy = strategy;
  }

  public int executeStrategy(int operator1, int operator2) {
      return strategy.doOperation(operator1, operator2);
  }

  public void setStrategy(Strategy strategy) {
      this.strategy = strategy;
  }
}
  1. 使用 Context 來查看當(dāng)它改變策略 Strategy 時的行為變化眼耀。
public class Test {
  public static void main(String[] args) {
      int operator1 = 10;
      int operator2 = 2;
      int result = 0;

      Context ctx = new Context(new OperationAdd());
      result = ctx.executeStrategy(operator1, operator2);
      System.out.println(operator1 + " + " + operator2 + " = " + result);

      ctx.setStrategy(new OperationMultiply());
      result = ctx.executeStrategy(operator1, operator2);
      System.out.println(operator1 + " * " + operator2 + " = " + result);

      ctx.setStrategy(new OperationSubstract());
      result = ctx.executeStrategy(operator1, operator2);
      System.out.println(operator1 + " - " + operator2 + " = " + result);

  }
}
  1. 結(jié)果
輸出結(jié)果.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末英支,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哮伟,更是在濱河造成了極大的恐慌潭辈,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澈吨,死亡現(xiàn)場離奇詭異把敢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谅辣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門修赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事柏副」窗睿” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵割择,是天一觀的道長眷篇。 經(jīng)常有香客問我,道長荔泳,這世上最難降的妖魔是什么蕉饼? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮玛歌,結(jié)果婚禮上昧港,老公的妹妹穿的比我還像新娘。我一直安慰自己支子,他們只是感情好创肥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著值朋,像睡著了一般叹侄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昨登,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天趾代,我揣著相機(jī)與錄音,去河邊找鬼篙骡。 笑死稽坤,一個胖子當(dāng)著我的面吹牛丈甸,可吹牛的內(nèi)容都是我干的糯俗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼睦擂,長吁一口氣:“原來是場噩夢啊……” “哼得湘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顿仇,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤淘正,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后臼闻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸿吆,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年述呐,在試婚紗的時候發(fā)現(xiàn)自己被綠了惩淳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡乓搬,死狀恐怖思犁,靈堂內(nèi)的尸體忽然破棺而出代虾,到底是詐尸還是另有隱情,我是刑警寧澤激蹲,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布棉磨,位于F島的核電站,受9級特大地震影響学辱,放射性物質(zhì)發(fā)生泄漏乘瓤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一项郊、第九天 我趴在偏房一處隱蔽的房頂上張望馅扣。 院中可真熱鬧,春花似錦着降、人聲如沸差油。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓄喇。三九已至,卻和暖如春交掏,著一層夾襖步出監(jiān)牢的瞬間妆偏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工盅弛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钱骂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓挪鹏,卻偏偏與公主長得像见秽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讨盒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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