java設(shè)計模式-策略模式

在我們需要實現(xiàn)一個功能的時候王带,可以有多種算法來實現(xiàn)的時候抑党,我們可以使用if...else或者case來選擇對應(yīng)的算法來實現(xiàn)功能遂蛀。但是如果又有新的算法添加進來的時候娜遵,我們不得不重新修改之前的代碼。

那么如何才能夠?qū)ζ溥M行優(yōu)雅的編碼而不會在有變化的時候去修改我們的原來的代碼呢礁蔗?

定義

策略模式定義了一系列的算法觉义,它們具有共同的一些通性,通過這個通性紐帶關(guān)聯(lián)起來浴井,在使用算法的時候可以相互切換晒骇。策略模式將算法的本身實現(xiàn)和使用算法隔離開來,這樣對于算法的變化從而讓調(diào)用者無法感知磺浙。

結(jié)構(gòu)

strategy.png

策略模式涉及到3個角色:

  • 使用環(huán)境(客戶端):持有抽象策略的引用洪囤,對外提供了切換策略的方法
  • 抽象策略:可以是接口也可以是抽象類,視具體情況而定
  • 具體策略:實現(xiàn)了策略中的算法定義屠缭,對具體算法的封裝

以一個排序為例

在我們對一組數(shù)據(jù)排序的時候箍鼓,可以有多種算法選擇:冒泡、選擇呵曹、插入等等款咖。

抽象策略

public interface ISort {
    void sort(int[] source);
}

具體策略

  • 冒泡排序

      public class BubbleSort implements ISort {
          @Override
          public void sort(int[] source) {
              int temp = 0;
              for (int i = 0; i < source.length - 1; i++) {
                  for (int j = 0; j < source.length - 1 - i; j++) {
                      if (source[j] > source[j + 1]) {
                          temp = source[j];
                          source[j] = source[j + 1];
                          source[j + 1] = temp;
                      }
                  }
              }
          }
      }
    
  • 插入排序

      public class InsertSort implements ISort {
          @Override
          public void sort(int[] source) {
              for (int i = 1; i < source.length; i++) {
                  int temp = source[i];
                  int j = i - 1;
                  for (; j >= 0 && source[j] > temp; j--) {
                      //將大于temp的值整體后移一個單位
                      source[j + 1] = source[j];
                  }
                  source[j + 1] = temp;
              }
          }
      }
    
  • 選擇排序

      public class ChooseSort implements ISort {
          @Override
          public void sort(int[] source) {
              for(int i=0;i<source.length;i++){
                  int lowIndex = i;
      
                  for(int j=i+1;j<source.length;j++){
                      if(source[j]<source[lowIndex]){
                          lowIndex = j;
                      }
                  }
      
                  //將當前第一個元素與它后面序列中的最小的一個 元素交換何暮,也就是將最小的元素放在最前端
                  int temp = source[i];
                  source[i] = source[lowIndex];
                  source[lowIndex] = temp;
              }
          }
      }
    

Context

    public class SortContext {
        private ISort sort;
    
        public void setSort(ISort sort) {
            this.sort = sort;
        }
    
        public void func(int[] source) {
    
            System.out.println("排序前的數(shù)據(jù):" + Arrays.toString(source));
            sort.sort(source);
            System.out.println("排序后的數(shù)據(jù): " + Arrays.toString(source));
        }
    
        public static void main(String[] args) {
            int[] source = {56,2,345,12,9,7,56};
    
            int[] source1 = source.clone();
            int[] source2 = source.clone();
            int[] source3 = source.clone();
    
            SortContext sortContext = new SortContext();
            sortContext.setSort(new BubbleSort());
            sortContext.func(source1);
            System.out.println("-------------------------------------");
            sortContext.setSort(new ChooseSort());
            sortContext.func(source2);
            System.out.println("-------------------------------------");
            sortContext.setSort(new InsertSort());
            sortContext.func(source3);
        }
    }

結(jié)果:

排序前的數(shù)據(jù):[56, 2, 345, 12, 9, 7, 56]
排序后的數(shù)據(jù): [2, 7, 9, 12, 56, 56, 345]
-------------------------------------
排序前的數(shù)據(jù):[56, 2, 345, 12, 9, 7, 56]
排序后的數(shù)據(jù): [2, 7, 9, 12, 56, 56, 345]
-------------------------------------
排序前的數(shù)據(jù):[56, 2, 345, 12, 9, 7, 56]
排序后的數(shù)據(jù): [2, 7, 9, 12, 56, 56, 345]

可以看到,我們使用不同的策略算法來達到了我們目的铐殃,在我們的客戶端并不清楚它們之間的區(qū)別海洼。策略模式的核心就是如何去調(diào)度這些算法而不是如何實現(xiàn)這些算法。

策略模式的優(yōu)點是可以動態(tài)的切換算法來改變客戶端的行為富腊。但是它的缺點也是比較明顯的坏逢,客戶端需要知道所有的策略實現(xiàn),如果策略比較多赘被,那么不僅僅是類增加了是整,客戶端管理起來也是一個麻煩事。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民假,一起剝皮案震驚了整個濱河市浮入,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羊异,老刑警劉巖事秀,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異野舶,居然都是意外死亡易迹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門平道,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睹欲,“玉大人,你說我怎么就攤上這事巢掺【淞妫” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵陆淀,是天一觀的道長。 經(jīng)常有香客問我先嬉,道長轧苫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任疫蔓,我火速辦了婚禮含懊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衅胀。我一直安慰自己岔乔,他們只是感情好,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布滚躯。 她就那樣靜靜地躺著雏门,像睡著了一般嘿歌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茁影,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天宙帝,我揣著相機與錄音,去河邊找鬼募闲。 笑死步脓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的浩螺。 我是一名探鬼主播靴患,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼要出!你這毒婦竟也來了鸳君?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤厨幻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后况脆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饭宾,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡格了,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盛末。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弹惦。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悄但,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情檐嚣,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布嚎京,位于F島的核電站嗡贺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鞍帝。R本人自食惡果不足惜诫睬,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帕涌。 院中可真熱鬧续徽,春花似錦架谎、人聲如沸炸宵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽会涎。三九已至,卻和暖如春末秃,著一層夾襖步出監(jiān)牢的瞬間概页,已是汗流浹背练慕。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铃将,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓劲阎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悯仙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗沦零。 張土汪:刷leetcod...
    土汪閱讀 12,750評論 0 33
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子货岭,從出生后第3個月起每個月都生一對兔子蠢终,小兔子...
    趙宇_阿特奇閱讀 1,878評論 0 2
  • 貪心算法 貪心算法總是作出在當前看來最好的選擇茴她。也就是說貪心算法并不從整體最優(yōu)考慮程奠,它所作出的選擇只是在某種意義上...
    fredal閱讀 9,248評論 3 52
  • 一、 1瞄沙、請用Java寫一個冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨云閱讀 1,387評論 0 6
  • 作為一個人上人,南希當然談過很多次戀愛申尼,從拖泥帶水的兩年銀行高管戀情到速戰(zhàn)速決的72小時酒吧邂逅垮卓,南希像一個精明的...
    惡魔米粒閱讀 385評論 0 0