最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java設(shè)計(jì)模式之策略模式

 更新時(shí)間:2021年11月07日 15:50:00   作者:一指流砂~  
這篇文章主要介紹了JAVA設(shè)計(jì)模式之策略模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下

一、什么是策略模式

策略模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使他們可以相互替換,且算法的變化不會(huì)影響到使用算法的客戶。需要設(shè)計(jì)一個(gè)接口,為一系列實(shí)現(xiàn)類(lèi)提供統(tǒng)一的方法,多個(gè)實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)該接口,設(shè)計(jì)一個(gè)抽象類(lèi)(可有可無(wú),屬于輔助類(lèi)),提供輔助函數(shù)。

策略模式定義和封裝了一系列的算法,它們是可以相互替換的,也就是說(shuō)它們具有共性,而它們的共性就體現(xiàn)在策略接口的行為上,另外為了達(dá)到最后一句話的目的,也就是說(shuō)讓算法獨(dú)立于使用它的客戶而獨(dú)立變化,我們需要讓客戶端依賴于策略接口。

一種很簡(jiǎn)單的解釋,在我們的開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到大量的if...else或者switch...case語(yǔ)句,當(dāng)這些語(yǔ)句在開(kāi)發(fā)中只是為了起到分流作用,這些分流和業(yè)務(wù)邏輯無(wú)關(guān),那么這個(gè)時(shí)候就可以考慮用策略模式。

二、策略模式的結(jié)構(gòu)

這個(gè)模式涉及到三個(gè)角色:

上下文環(huán)境(Context)角色:持有一個(gè)Strategy的引用。

抽象策略(Strategy)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類(lèi)實(shí)現(xiàn)。此角色給出所有的具體策略類(lèi)所需的接口。

具體策略(ConcreteStrategy)角色:包裝了相關(guān)的算法或行為

三、策略模式的應(yīng)用場(chǎng)景

舉一個(gè)例子,商場(chǎng)搞促銷(xiāo)--打8折,滿200送50,滿1000送禮物,這種促銷(xiāo)就是策略。

再舉一個(gè)例子,dota里面的戰(zhàn)術(shù),玩命四保一,三偽核體系,推進(jìn)體系,大招流體系等,這些戰(zhàn)術(shù)都是一種策略。

應(yīng)用場(chǎng)景:

1、 多個(gè)類(lèi)只區(qū)別在表現(xiàn)行為不同,可以使用Strategy模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為。

2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來(lái)用其它方式來(lái)實(shí)現(xiàn)。

3、 對(duì)客戶隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié),彼此完全獨(dú)立。

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

優(yōu)點(diǎn):

1、結(jié)構(gòu)清晰,把策略分離成一個(gè)個(gè)單獨(dú)的類(lèi)「替換了傳統(tǒng)的 if else」2、代碼耦合度降低,安全性提高「各個(gè)策略的細(xì)節(jié)被屏蔽」

缺點(diǎn):

1、客戶端必須要知道所有的策略類(lèi),否則你不知道該使用那個(gè)策略,所以策略模式適用于提前知道所有策略的情況下2、策略類(lèi)數(shù)量增多(每一個(gè)策略類(lèi)復(fù)用性很小,如果需要增加算法,就只能新增類(lèi))五、策略模式和簡(jiǎn)單工廠模式的異同

在上篇文章已經(jīng)提過(guò)了,傳送地址:深入理解設(shè)計(jì)模式(二):簡(jiǎn)單工廠模式

六、策略模式的實(shí)現(xiàn)

Strategy類(lèi),定義所有支持的算法的公共接口

//Strategy類(lèi),定義所有支持的算法的公共接口
abstract class Strategy
{
    //算法方法
    public abstract void AlgorithmInterface();
}

oncreteStrategy,封裝了具體的算法或行為,繼承于Strategy

//算法A
    class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法A的實(shí)現(xiàn)");
        }
    }
    //算法B
    class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法B的實(shí)現(xiàn)");
        }
    }
    //算法C
    class ConcreteStrategyC : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("算法C的實(shí)現(xiàn)");
        }
    }

Context,用一個(gè)ConcreteStrategy來(lái)配置,維護(hù)一個(gè)對(duì)Strategy對(duì)象的引用

//Context,用一個(gè)ConcreteStrategy來(lái)配置,維護(hù)一個(gè)對(duì)Strategy對(duì)象的引用
    class Context
    {
        Strategy Strategy;
        public Context(Strategy Strategy)
        {
            this.Strategy = Strategy;
        }
        //上下文接口
        public void ContextInterface()
        {
            Strategy.AlgorithmInterface();
        }
    }

客戶端代碼

static void Main(string[] args)
        {
            Context Context;

            Context = new Context(new ConcreteStrategyA());
            Context.ContextInterface();

            Context = new Context(new ConcreteStrategyB());
            Context.ContextInterface();

            Context = new Context(new ConcreteStrategyC());
            Context.ContextInterface();

            Console.Read();
        }

七、策略模式和簡(jiǎn)單工廠模式的結(jié)合

改造后的Context

class Context
    {
        Strategy Strategy=null;
        public Context(string type)
        {
            switch (type)
            {
                case "A":
                    ConcreteStrategyA A = new ConcreteStrategyA();
                    Strategy = A;
                    break;
                case "B":
                    ConcreteStrategyB B = new ConcreteStrategyB();
                    Strategy = B;
                    break;
                case "C":
                    ConcreteStrategyC C = new ConcreteStrategyC();
                    Strategy = C;
                    break;
            }
        }
        //上下文接口
        public void ContextInterface()
        {
            Strategy.AlgorithmInterface();
        }
    }

改造后的客戶端代碼

static void Main(string[] args)
        {
            Context Context = new Context("這里是相應(yīng)的算法類(lèi)型字符串");
            Context.ContextInterface();

            Console.Read();
        }

對(duì)比下改造前后的區(qū)別不難看出,改造前客戶端需要認(rèn)識(shí)兩個(gè)類(lèi),Context和ConcreteStrategy。而策略模式和簡(jiǎn)單工廠模式結(jié)合后,客戶端只需要認(rèn)識(shí)一個(gè)類(lèi)Context,降低了耦合性。

八、策略枚舉的實(shí)現(xiàn)

我們可以使用枚舉在一個(gè)類(lèi)中實(shí)現(xiàn)以上所有的功能及三種不同的角色,下面看看怎么通過(guò)枚舉來(lái)實(shí)現(xiàn)策略模式

public enum Calculator 
{    ADD("+") {        
        public int exec(int a, int b) {    
            return a+b;        
        }
    },        
    SUB("-") {        
        public int exec(int a, int b) {        
            return a-b;        
            }    
    };            
    public abstract int exec(int a, int b);        
    //運(yùn)算符    
    private String value = "";        
    private Calculator(String value)
    {        
        this.value = value;
    }     
    public String getValue() 
    {        
        return value;
    }
}

在枚舉類(lèi)中,定義的抽象方法就像當(dāng)時(shí)之前的接口,每一個(gè)枚舉ADD SUB相當(dāng)是一個(gè)具體的實(shí)現(xiàn)類(lèi)(策略角色),而整個(gè)枚舉類(lèi)就是策略的分裝角色。

這是從網(wǎng)上copy的代碼,本人不怎么喜歡這么寫(xiě),總感覺(jué)違背了代碼規(guī)范。

九、總結(jié)

策略模式,實(shí)質(zhì)就是封裝了一些算法,讓算法可以互相替換,用戶可以自由選擇這些算法進(jìn)行操作。策略模式本身理解起來(lái)沒(méi)什么難點(diǎn),但是在實(shí)際應(yīng)用中其本身主要結(jié)合工廠模式一起使用。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

  • SpringBoot整合Netty的流程步驟

    SpringBoot整合Netty的流程步驟

    Netty是一個(gè)基于Java的開(kāi)源網(wǎng)絡(luò)應(yīng)用框架,它提供了高性能、異步事件驅(qū)動(dòng)的網(wǎng)絡(luò)編程能力,Netty旨在幫助開(kāi)發(fā)者構(gòu)建高性能、高可靠性的網(wǎng)絡(luò)應(yīng)用程序,本文給大家詳細(xì)介紹了SpringBoot整合Netty的流程步驟,需要的朋友可以參考下
    2023-09-09
  • 初次使用IDEA創(chuàng)建maven項(xiàng)目的教程

    初次使用IDEA創(chuàng)建maven項(xiàng)目的教程

    這篇文章主要介紹了初次使用IDEA創(chuàng)建maven項(xiàng)目的教程講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java 高并發(fā)九:鎖的優(yōu)化和注意事項(xiàng)詳解

    Java 高并發(fā)九:鎖的優(yōu)化和注意事項(xiàng)詳解

    本文主要介紹Java高并發(fā)鎖的優(yōu)化和注意事項(xiàng),這里整理了詳細(xì)的資料,并講解了 1. 鎖優(yōu)化的思路和方法 2. 虛擬機(jī)內(nèi)的鎖優(yōu)化 3. 一個(gè)錯(cuò)誤使用鎖的案例 4. ThreadLocal及其源碼分析等知識(shí),有需要的小伙伴可以參考下
    2016-09-09
  • Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解裝飾器模式

    Java設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解裝飾器模式

    裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對(duì)客戶端透明的方式拓展對(duì)象的功能,是繼承關(guān)系的一種替代方案,本篇文章以虹貓藍(lán)兔生動(dòng)形象的為你帶來(lái)詳細(xì)講解
    2022-04-04
  • 淺談spring-boot的單元測(cè)試中,@Before不被執(zhí)行的原因

    淺談spring-boot的單元測(cè)試中,@Before不被執(zhí)行的原因

    這篇文章主要介紹了淺談spring-boot的單元測(cè)試中,@Before不被執(zhí)行的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • java布局管理之CardLayout簡(jiǎn)單實(shí)例

    java布局管理之CardLayout簡(jiǎn)單實(shí)例

    這篇文章主要為大家詳細(xì)介紹了java布局管理之CardLayout的簡(jiǎn)單實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Spring中的AOP原理與使用詳解

    Spring中的AOP原理與使用詳解

    這篇文章主要介紹了Spring中的AOP原理與使用詳解,AOP意為面向切面編程,可以通過(guò)預(yù)編譯方式或運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加功能的一種技術(shù),需要的朋友可以參考下
    2023-12-12
  • 一名Java高級(jí)工程師需要學(xué)什么?

    一名Java高級(jí)工程師需要學(xué)什么?

    作為一名Java高級(jí)工程師需要學(xué)什么?如何成為一名合格的工程師,這篇文章給了你較為詳細(xì)的答案,需要的朋友可以參考下
    2017-08-08
  • Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能

    Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能

    這篇文章主要為大家詳細(xì)介紹了Servlet簡(jiǎn)單實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 最新評(píng)論

    怀仁县| 金寨县| 搜索| 剑阁县| 贵德县| 肇源县| 乐平市| 永仁县| 吴堡县| 阳信县| 福泉市| 乳源| 桐庐县| 四子王旗| 永定县| 张家川| 镇远县| 永仁县| 十堰市| 甘谷县| 达州市| 镇江市| 海门市| 藁城市| 汉寿县| 安西县| 寿阳县| 遂溪县| 改则县| 邳州市| 楚雄市| 中西区| 天峻县| 汝南县| 南澳县| 宜宾市| 苏尼特左旗| 乾安县| 铁力市| 怀柔区| 宁化县|