第十章-------策略模式

好久沒寫博客了栓辜,最近也不知道在忙些什么,盡管公司項目新需求沒有垛孔,我只是維護升級藕甩,算是比較閑吧,但是感覺好幾把坑周荐,上個哥們留下的坑我得填狭莱;緊急上了個小版本;現(xiàn)在總算有點時間繼續(xù)進行設計模式的研究概作;還有就是最近在看《牧羊少年奇幻之旅》修身養(yǎng)性腋妙;技術方面在看那本數(shù)據(jù)結構與算法經(jīng)典問題解析的書,一個印度人寫的緒論感覺好復雜讯榕;相信深入貫徹估計會長進不兄杷亍匙睹;那么稱這個時間來看看策略模式的概念;

先看下定義:什么是策略模式济竹? 策略模式(Strategy Pattern)是一種比較簡單的模式痕檬,也叫做政策模式(Policy
Pattern);Define a family of algorithms,encapsulate each one,and make them interchangeable.(定義一組
算法送浊,將每個算法都封裝起來梦谜,并且使它們之間可以互換。)袭景,
書中是以諸葛亮三個錦囊妙計保劉備江東娶親 全身而退的例子唁桩;我們現(xiàn)在利用現(xiàn)實生活中的例子來體現(xiàn)策略模式的內(nèi)涵;
今年的雙十一可謂是鬧得歡耸棒,看著琳瑯滿目的商品就連我都忍不住花了3000多購物朵夏,一直想買個人工智能實驗室出品的天貓精靈玩玩;雙十一那天確實有優(yōu)惠榆纽,統(tǒng)一價499,天貓超級會員只需要99捏肢;哎有了這個是不是可以用策略模式來搞一下奈籽;
我們假設,為了回饋廣大新老客戶鸵赫;定義三種策略豪治;
天貓超級會員锯岖,全場400元優(yōu)惠
天貓磚石會員,滿1000元立減200
天貓高級會員 滿1500減 200
巴拉巴拉......
好的業(yè)務場景有了我們用代碼來表現(xiàn)一下:
首先我們定義一個策略抽象接口類:

            package com.ldl.istrate;
               /**
           * @author deling 2017年11月28日
               */
         public interface Strategy {
        public void operateStrategy(double consumptionAmount);
             }

接下來我們定義三個會員類:

   package com.ldl.istrate;

    public class DiamondMembership implements Strategy {
@Override
public void operateStrategy(double consumptionAmount) {
    if(consumptionAmount>=1000) {
        System.out.println("我是鉆石會員消費"+(consumptionAmount-200)+"元");
    }else {
        System.out.println("我是鉆石會員消費"+consumptionAmount+"元");
    }
    
}}

超級會員:

             package com.ldl.istrate;
                /**
           * 超級會員
              * 
                * @author deling 2017年11月28日
               */
          public class SuperMembers implements Strategy {

/* (non-Javadoc)
 * @see com.ldl.istrate.Strategy#operateStrategy(double)
 */
@Override
public void operateStrategy(double consumptionAmount) {
    if(consumptionAmount-400<=0) {
        System.out.println("您是超級會員消費"+0+"元");
    }else {
        System.out.println("您是超級會員消費"+(consumptionAmount-400)+"元");
    }       
}
   }

            高級會員:
                         

       package com.ldl.istrate;

                 /**
                    * @author deling 高級會員 2017年11月28日
            */
            public class SeniorMember implements Strategy {

@Override
public void operateStrategy(double consumptionAmount) {
    if (consumptionAmount >= 1500) {
        System.out.println("您是高級會員消費" + (consumptionAmount - 200) + "元");
    } else {
        System.out.println("您是高級會員消費" + consumptionAmount + "元");
    }

}

      }

在弄個執(zhí)行策略的包裝類:

    package com.ldl.istrate;

     /**
     *  @author deling 執(zhí)行策略 2017年11月28日
     */
         public class Context {
 private Strategy strategy;

/**
 * 執(zhí)行策略
 */
public void executionStrategy(double consumptionAmount) {
    this.strategy.operateStrategy(consumptionAmount);
}

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

      }

執(zhí)行一下:

             package com.ldl.istrate;

          /**
          * @author deling
        *2017年11月28日
          */
    public class Client {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Strategy strategy=new DiamondMembership();
    Context context=new Context(strategy);
    context.executionStrategy(800);
    strategy=   new SuperMembers();
    context=new Context(strategy);
    context.executionStrategy(300);
    strategy=new SeniorMember();
    context=new Context(strategy);
    context.executionStrategy(300);
}

 }

圖片.png

看到了效果有了,這就是用了策略模式灭衷;
我們先總結一下;等會畫個類圖更清晰:

缺點: 1.策略類數(shù)量增多,每一個策略都是一個類冈闭,復用的可能性很小稼稿,類數(shù)量增多

  1. 所有的策略類都需要對外暴露;我們可以使用其他模式來修正這個缺陷,
    如工廠方法模式者吁、代理模式或享元模式

優(yōu)點:

  1. 避免使用多重條件判斷
    2.算法可以自由切換

策略模式的使用場景:
1.多個類只有在算法或行為上稍有不同的場景窘俺。
2.算法需要自由切換的場景。


圖片.png
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末复凳,一起剝皮案震驚了整個濱河市瘤泪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌育八,老刑警劉巖对途,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異髓棋,居然都是意外死亡实檀,警方通過查閱死者的電腦和手機惶洲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲妙,“玉大人湃鹊,你說我怎么就攤上這事×头埽” “怎么了币呵?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侨颈。 經(jīng)常有香客問我余赢,道長,這世上最難降的妖魔是什么哈垢? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任妻柒,我火速辦了婚禮,結果婚禮上耘分,老公的妹妹穿的比我還像新娘举塔。我一直安慰自己,他們只是感情好求泰,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布央渣。 她就那樣靜靜地躺著,像睡著了一般渴频。 火紅的嫁衣襯著肌膚如雪芽丹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天卜朗,我揣著相機與錄音拔第,去河邊找鬼。 笑死场钉,一個胖子當著我的面吹牛蚊俺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逛万,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼春叫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泣港?” 一聲冷哼從身側響起暂殖,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎当纱,沒想到半個月后呛每,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡坡氯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年晨横,在試婚紗的時候發(fā)現(xiàn)自己被綠了洋腮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡手形,死狀恐怖啥供,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情库糠,我是刑警寧澤伙狐,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站瞬欧,受9級特大地震影響贷屎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艘虎,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一唉侄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧野建,春花似錦属划、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陶舞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绪励,已是汗流浹背肿孵。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疏魏,地道東北人停做。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像大莫,于是被迫代替她去往敵國和親蛉腌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

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