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

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

先看下定義:什么是策略模式? 策略模式(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;哎有了這個是不是可以用策略模式來搞一下;
我們假設(shè),為了回饋廣大新老客戶;定義三種策略;
天貓超級會員,全場400元優(yōu)惠
天貓磚石會員,滿1000元立減200
天貓高級會員 滿1500減 200
巴拉巴拉......
好的業(yè)務(wù)場景有了我們用代碼來表現(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

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

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

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

優(yōu)點:

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

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


圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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