<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          策略模式淺析

          共 3308字,需瀏覽 7分鐘

           ·

          2021-05-23 21:55

          今天是一個(gè)特殊的日子,袁隆平院士沒了,中午聽到這個(gè)消息,心里很難受,能和牛人活在一個(gè)年代是我們的榮幸,我也不知道說啥,就是覺得袁老一輩子返璞歸真,簡簡單單,那是我喜歡的狀態(tài),祝袁老一路走好!
          之前讀過程杰老師寫的《大話設(shè)計(jì)模式》,但是在工作中好像并沒有怎么使用,工作中我貌似就用過工廠模式,最近的業(yè)務(wù)本來是可以使用策略模式的,但是我沒用,此處省略一萬字。所以以后作者不得不發(fā)文章但是又覺得無話可說的時(shí)候,可能就抄一篇設(shè)計(jì)模式來勉強(qiáng)達(dá)到日更的目標(biāo),今天學(xué)一下策略模式。
          策略模式(strategy):定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的用戶。
          在之前的文章中,我們說代碼中的switch其實(shí)不太好,原因是switch會讓代碼局限在一個(gè)類型碼上,所以在《重構(gòu)》這本書中盡量采用策略模式和狀態(tài)模式將對其改造。主要是將類型碼的功能遷移到類中,換句話說就是要針對具體的case創(chuàng)建不同的類。但是考慮到每種case情況都具有類似的功能,因此可以將其共性的特點(diǎn)提取出來形成一個(gè)接口,具體的策略讓具體的類去實(shí)現(xiàn)。

          當(dāng)具有策略的實(shí)現(xiàn)類的時(shí)候,我們最終代碼還是有一個(gè)決策使用那種策略類,因此聯(lián)系所有策略子類就成了工作類的任務(wù),因此策略模式就變成如下所示:
          這塊為何要進(jìn)行一個(gè)策略的包裝類?相對來說我們其他業(yè)務(wù)在調(diào)用策略模式的時(shí)候如果跟策略模式base-strategy強(qiáng)綁定勢必導(dǎo)致base-strategy的變動(dòng)導(dǎo)致調(diào)用方很被動(dòng)。因此這塊的策略包裝類將這個(gè)變動(dòng)局限在一處從而使得局部代碼的變動(dòng)引起的整體改造變小,代價(jià)較低。當(dāng)然我們也可以不用策略包裝類進(jìn)行聚合,但是為了策略的統(tǒng)一決策,那么勢必就是采用狀態(tài)值去決策,那么就是簡單工廠模式與具體的策略的整合,注意這里不是策略模式,也就是簡單工程模式+策略,在代碼中為了讓代碼更加簡潔,我們可以靈活使用構(gòu)造方法。所以我們這里寫個(gè)簡單的例子:
          接口:
          public interface BaseStrategy {

          int totalPrice = 0;

          /** * 測試策略模式 */ void test();}
          策略A:
          public class StrategyA implements BaseStrategy {    /**     * 測試A     */    public void test() {        System.out.println("策略A");    }}
          策略B:
          public class StrategyB implements BaseStrategy{    /**     * 測試B     */    public void test() {        System.out.println("策略B");    }}
          策略C:
          public class StrategyC implements BaseStrategy{    /**     * 測試C     */    public void test() {        System.out.println("策略C");    }}
          策略包裝類:
          /** * 總領(lǐng)全局 */public class StrategyContent {    /**     * 引子     */    private BaseStrategy baseStrategy;
          /** * 巧用構(gòu)造函數(shù),關(guān)聯(lián)具體策略 */ public StrategyContent(int type){ switch (type){ case 1: baseStrategy=new StrategyA(); break; case 2: baseStrategy=new StrategyB(); break; case 3: baseStrategy=new StrategyC(); break; default: break; } }
          /** * 總領(lǐng)調(diào)度 */ public void testStrategy(){ baseStrategy.test(); }}
          上邊的示例我們采用簡單工廠和策略的直接嵌套,對于純策略模式來說其實(shí)將具體的策略決策權(quán)放到了調(diào)用方。具體示例如下:
          public class OriginStrategy {    /**     * 基礎(chǔ)策略模式     */    BaseStrategy baseStrategy;
          /** * 初始化 * @param baseStrategy */ OriginStrategy(BaseStrategy baseStrategy){ this.baseStrategy=baseStrategy; }
          /** * 策略調(diào)用 */ public void test(){ this.baseStrategy.test(); }}
          調(diào)用方:
          public class TestStrategyContentMain {    /**     * 業(yè)務(wù)調(diào)用方     * @param args     */    public static void main(String[] args) {        OriginStrategy originStrategy;        switch (1){            case 1:                originStrategy=new OriginStrategy(new StrategyA());                break;            case 2:                originStrategy=new OriginStrategy(new StrategyB());                break;            case 3:                originStrategy=new OriginStrategy(new StrategyC());                break;            default:                throw new IllegalStateException("Unexpected value: " + 1);        }        originStrategy.test();    }}
          在學(xué)完了策略模式之后,作者是覺得策略模式的一種更好實(shí)現(xiàn)是簡單工廠模式+策略的實(shí)現(xiàn),也就是將策略的具體決策隱藏,這樣的好處就是說對于散落與業(yè)務(wù)中的分散調(diào)用來說更加容易修改。除此之外策略的增刪也更加容易,對于代碼來說變動(dòng)也更加少一些。我們在工作中可以使用策略模式來處理類似多種業(yè)務(wù)場景。在spring編程框架中開發(fā)中我們要根據(jù)具體的狀態(tài)碼從ioc中獲取具體的策略,那么我們就需要獲取到spring上下文。需要實(shí)現(xiàn)的接口大概是applicationContentaWare。

          瀏覽 16
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品鸡巴 | 干欧美视频 | 中文乱片A片AAA毛片 | 韩日色网 | 久久人人爽人人爽人人片aV东京热 |