亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

我的Java設(shè)計(jì)模式-策略模式

zilu / 792人閱讀

摘要:孫臏心里一萬(wàn)個(gè)草泥馬在奔騰,差點(diǎn)沒(méi)噎死自己滾一邊去,我們這盤(pán)跟他賽馬開(kāi)始,策略模式上場(chǎng)。在設(shè)計(jì)模式之禪中的提出通過(guò)策略枚舉和反射機(jī)制對(duì)策略模式進(jìn)行改良,膜拜了但是要添加或淘汰策略,還是得去對(duì)枚舉進(jìn)行修改,也不符合開(kāi)閉原則。

今天給大家說(shuō)說(shuō)田忌賽馬的故事。如有雷同,純屬巧合!話說(shuō)在戰(zhàn)國(guó)時(shí)期,群雄割據(jù),硝煙四起,茶余飯后還是少不了娛樂(lè)活動(dòng)的,其中賽馬是最火爆的。一天,孫臏看到田忌像個(gè)死雞似的就知道肯定賽馬又輸給了齊威王,立馬抓住田忌去跟齊威王再賽一場(chǎng)。

孫臏:“小忌啊,哥哥看著你心疼啊,哥哥出對(duì)策幫你贏一盤(pán)如何?”。

田忌聽(tīng)到之后高興得飛起,瞪大了兩只金魚(yú)眼“Really?只要能贏,我赴湯蹈火,以身相許又如何~”。

孫臏心里一萬(wàn)個(gè)草泥馬在奔騰,差點(diǎn)沒(méi)噎死自己“滾一邊去,我們這盤(pán)跟他show hand!”賽馬開(kāi)始,策略模式上場(chǎng)。此處應(yīng)該有bgm“讓我們紅塵作伴活得瀟瀟灑灑 策馬奔騰共享人世繁華...呀啊呀啊,呀啊啊啊啊啊啊~”

一、策略模式 定義

??定義一組算法,將每一個(gè)算法封裝起來(lái),從而使它們可以相互切換。

特點(diǎn)

??1)一組算法,那就是不同的策略。

??2)這組算法都實(shí)現(xiàn)了相同的接口或者繼承相同的抽象類(lèi),所以可以相互切換。

UML

策略模式涉及到的角色有三個(gè):

??- 封裝角色:上層訪問(wèn)策略的入口,它持有抽象策略角色的引用。

??- 抽象策略角色:提供接口或者抽象類(lèi),定義策略組必須擁有的方法和屬性。

??- 具體策略角色:實(shí)現(xiàn)抽象策略,定義具體的算法邏輯。

二、實(shí)戰(zhàn)

在跟齊威王比賽之前來(lái)分析下之前輸?shù)舯荣惖摹安呗浴?,首先?lái)看封裝角色,代碼如下:

public class Context {

    private Strategy strategy;

    /**
     * 傳進(jìn)的是一個(gè)具體的策略實(shí)例
     * @param strategy
     */
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 調(diào)用策略
     */
    public void contextInterface() {
        strategy.algorithmLogic();
    }

}

Context持有Strategy的引用,并且提供了調(diào)用策略的方法,很清晰。

再來(lái)抽象策略角色,定義了策略組的方法,代碼如下:

public interface Strategy {

    public void algorithmLogic();

}

輸?shù)舯荣惖摹安呗浴币彩且环N策略,是具體策略角色類(lèi),來(lái)看代碼:

public class ConcreteStrategyA implements Strategy{

    @Override
    public void algorithmLogic() {
        // 具體的算法邏輯(輸了比賽)
        System.out.println("第一場(chǎng):上等馬vs上等馬  第二場(chǎng):中等馬vs中等馬  第三場(chǎng):下等馬vs下等馬  賽果:輸!");
    }
}

看到這里,孫臏一陣無(wú)語(yǔ),慘不忍睹也得看結(jié)果的,客戶(hù)端代碼如下:

public class Client {

    public static void main(String[] args) {
        // 操控比賽,這場(chǎng)要輸
        Context context = new Context(new ConcreteStrategyA());
        context.contextInterface();
    }
}

兩句代碼,傳入具體策略對(duì)象,調(diào)用策略入口方法,運(yùn)行結(jié)果如下:

第一場(chǎng):上等馬vs上等馬  第二場(chǎng):中等馬vs中等馬  第三場(chǎng):下等馬vs下等馬  賽果:輸!

田忌跟孫臏說(shuō):“臏哥,我怕!”,孫臏:“不用怕,哥哥在!”。

田忌找到齊威王“大王,我們?cè)?..再再來(lái)一盤(pán),輸了請(qǐng)吃飯”

瞅瞅?qū)O臏出的策略,一睹軍事家的風(fēng)采,“贏”的具體策略類(lèi)代碼如下:

public class ConcreteStrategyB implements Strategy{
    @Override
    public void algorithmLogic() {
        // 贏
        System.out.println("第一場(chǎng):下等馬vs上等馬  第二場(chǎng):上等馬vs中等馬  第三場(chǎng):中等馬vs下等馬  賽果:贏!");
    }
}

再來(lái)看客戶(hù)端的代碼:

public class Client {
    public static void main(String[] args) {

        // 操控比賽,這場(chǎng)要贏,哈哈哈
        Context context = new Context(new ConcreteStrategyB());
        context.contextInterface();
    }
}

運(yùn)行結(jié)果如下:

第一場(chǎng):下等馬vs上等馬  第二場(chǎng):上等馬vs中等馬  第三場(chǎng):中等馬vs下等馬  賽果:贏!

田忌拍爛手掌,重要的是今天晚飯有著落了,還要對(duì)臏哥哥以身相許的......

三、策略模式的優(yōu)缺點(diǎn) 優(yōu)點(diǎn)

1)良好的擴(kuò)展性。增加一種策略,只要實(shí)現(xiàn)接口,寫(xiě)上具體邏輯就可以了。當(dāng)舊策略不需要時(shí),直接剔除就行。

2)良好的封裝性。策略的入口封裝在Context封裝類(lèi)中,客戶(hù)端只要知道使用哪種策略就傳哪種策略對(duì)象就可以了。

3)避免了像簡(jiǎn)單工廠模式這樣的多重條件判斷。

缺點(diǎn)

1)客戶(hù)端必須了解策略組的各個(gè)策略,并且決定使用哪一個(gè)策略,也就是各個(gè)策略需要暴露給客戶(hù)端。

2)如果策略增多,策略類(lèi)的數(shù)量就會(huì)增加。

四、擴(kuò)展

上面說(shuō)到策略模式有一個(gè)缺點(diǎn),就是所有的策略都必須暴露出去,讓客戶(hù)端自行選擇策略使用?,F(xiàn)在來(lái)改善這一缺陷,而改善這個(gè)缺陷需要跟簡(jiǎn)單工廠模式結(jié)合混編,繼續(xù)往下看。

當(dāng)然,軍事家孫臏也會(huì)想到這一點(diǎn),怎么可能會(huì)把自己的套路全都暴露給別人呢,那還怎么玩是吧。不過(guò),歷史上并沒(méi)有說(shuō)孫臏改善了這點(diǎn),現(xiàn)在是我來(lái)改善這個(gè)缺陷,哈哈哈~

策略工廠

思考一個(gè)問(wèn)題,策略暴露了,改善就是把策略隱藏起來(lái),而工廠模式就有這個(gè)效果,客戶(hù)端不需要知道策略具體是什么,只知道結(jié)果就好。OK,那么我們可以使用工廠模式把策略當(dāng)做產(chǎn)品生成嗎?答案是肯定的。策略模式的入口就在Context封裝類(lèi),可以從這個(gè)角色做手腳。先看代碼:

public class Context {

    private Strategy strategy;

    // 把創(chuàng)建策略放在封裝角色內(nèi),客戶(hù)端只需要知道結(jié)果
    public void factory(String strategyType) {
        if (strategyType.equals("WIN")) {
            strategy = new ConcreteStrategyB();
        } else if (strategyType.equals("LOSE")) {
            strategy = new ConcreteStrategyA();
        }
    }

    /**
     * 調(diào)用策略
     */
    public void contextInterface() {
        strategy.algorithmLogic();
    }
}

代碼很簡(jiǎn)單,增加了factory的方法,這個(gè)方法作用就是創(chuàng)建策略對(duì)象。這樣,客戶(hù)端就不需要去理解具體的策略,只需知道具體策略的結(jié)果就好??纯纯蛻?hù)端代碼:

public class Client {

    public static void main(String[] args) {
        Context context = new Context();
        context.factory("LOSE");
        context.contextInterface();
    }
}


總結(jié)

注意策略模式和工廠方法模式的區(qū)別,在前面工廠方法模式中有說(shuō)到,這里就不再闡述。策略模式本身也相對(duì)比較簡(jiǎn)單,重點(diǎn)在它的擴(kuò)展以及其它模式的對(duì)比,分析各自的優(yōu)缺點(diǎn)。來(lái)看看策略工廠這樣的模式存在缺點(diǎn)嗎?很明顯,如果需要添加或者淘汰一種策略,Context就必須修改,這并不符合開(kāi)閉原則。在《設(shè)計(jì)模式之禪》中的提出通過(guò)策略枚舉和反射機(jī)制對(duì)策略模式進(jìn)行改良,膜拜了~但是要添加或淘汰策略,還是得去對(duì)枚舉進(jìn)行修改,也不符合開(kāi)閉原則。根據(jù)自己項(xiàng)目情況,選擇最適合自己項(xiàng)目的模式。下一篇是責(zé)任鏈模式,歡迎繼續(xù)關(guān)注,goodbye!

設(shè)計(jì)模式Java源碼GitHub下載https://github.com/jetLee92/DesignPattern

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67933.html

相關(guān)文章

  • 我的Java設(shè)計(jì)模式-工廠方法模式

    摘要:工廠方法模式和策略的模式有什么區(qū)別區(qū)別在于,策略模式強(qiáng)調(diào)的是提供不同的策略方案,而工廠方法模式強(qiáng)調(diào)的是產(chǎn)品本身。 女朋友dodo鬧脾氣,氣勢(shì)洶洶的說(shuō)我要吃雪糕。筆者心里啊樂(lè)滋滋的,一支雪糕就能哄回來(lái),不亦樂(lè)乎?! 但是,雪糕買(mǎi)回來(lái)了,她竟然說(shuō)不想吃雪糕了,突然想吃披薩。呵呵了,憋了一股勁沒(méi)問(wèn)題,又屁顛屁顛的去把披薩買(mǎi)回來(lái)。 世事難料,dodo同學(xué)又放大招了,披薩太上火了,我要吃芝士蛋糕...

    QiuyueZhong 評(píng)論0 收藏0
  • 面向?qū)ο笈c設(shè)計(jì)模式

    摘要:而面向?qū)ο笫前褑?wèn)題中出現(xiàn)的角色獨(dú)立出來(lái),讓他們互相通信來(lái)完成最終的問(wèn)題。不管是面向過(guò)程還是面向?qū)ο?,都是我們認(rèn)識(shí)世界的一種方法。工廠方法模式問(wèn)題陳述在面向?qū)ο缶幊讨凶钔ǔ5姆椒ㄊ且粋€(gè)操作符產(chǎn)生一個(gè)對(duì)象實(shí)例操作符就是用來(lái)構(gòu)造對(duì)象實(shí)例的。 前言 大一的時(shí)候?qū)W校就開(kāi)了C語(yǔ)言這門(mén)課,最開(kāi)始糊里糊涂無(wú)從下手,后來(lái)慢慢寫(xiě)了幾個(gè)幾百行的小程序就逐漸明白編程是怎么一回事了,還以為自己都懂了(too y...

    macg0406 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<